В даний час я розробляю n-ярусне рішення, яке використовує Entity Framework 5 (.net 4) в якості своєї стратегії доступу до даних, але мене хвилює питання про те, як включити введення залежності, щоб зробити його тестовим / гнучким.
Мій поточний макет рішення такий (моє рішення називається Alcatraz):
Alcatraz.WebUI : Проект веб-форми asp.net, інтерфейс для переднього користувача, посилання на проекти Alcatraz.Business та Alcatraz.Data.Models .
Alcatraz.Business : Бібліотечний проект класу, містить ділову логіку, посилання на проекти Alcatraz.Data.Access , Alcatraz.Data.Models
Alcatraz.Data.Access : проект бібліотеки класів, в якому розміщені AlcatrazModel.edmx і AlcatrazEntities
DbContext, посилання на проекти Alcatraz.Data.Models .
Alcatraz.Data.Models : Проект бібліотеки класів, містить POCO для моделі Alcatraz, відсутні посилання.
Моє бачення того, як буде працювати це рішення, це те, що web-ui створить сховище в бізнес-бібліотеці, це сховище матиме залежність (через конструктор) рядка з'єднання (не AlcatrazEntities
екземпляра). Веб-інтерфейс знав би рядки підключення до бази даних, але не те, що це був рядок з'єднання рамки об'єкта.
У бізнес-проекті:
public class InmateRepository : IInmateRepository
{
private string _connectionString;
public InmateRepository(string connectionString)
{
if (connectionString == null)
{
throw new ArgumentNullException("connectionString");
}
EntityConnectionStringBuilder connectionBuilder = new EntityConnectionStringBuilder();
connectionBuilder.Metadata = "res://*/AlcatrazModel.csdl|res://*/AlcatrazModel.ssdl|res://*/AlcatrazModel.msl";
connectionBuilder.Provider = "System.Data.SqlClient";
connectionBuilder.ProviderConnectionString = connectionString;
_connectionString = connectionBuilder.ToString();
}
public IQueryable<Inmate> GetAllInmates()
{
AlcatrazEntities ents = new AlcatrazEntities(_connectionString);
return ents.Inmates;
}
}
У веб-інтерфейсі:
IInmateRepository inmateRepo = new InmateRepository(@"data source=MATTHEW-PC\SQLEXPRESS;initial catalog=Alcatraz;integrated security=True;");
List<Inmate> deathRowInmates = inmateRepo.GetAllInmates().Where(i => i.OnDeathRow).ToList();
У мене є кілька пов'язаних питань щодо цього дизайну.
Чи має такий дизайн навіть сенс з точки зору можливостей Entity Frameworks? Я чув, що рамка Entity вже використовує шаблон "Одиниця роботи", чи просто я додаю ще один шар абстрактного?
Я не хочу, щоб мій веб-інтерфейс безпосередньо спілкувався з Entity Framework (або навіть посилався на це з цього приводу), я хочу, щоб весь доступ до бази даних проходив через бізнес-рівень, оскільки в майбутньому я буду мати кілька проектів, що використовують один і той же бізнес-рівень (веб-сервіс, додаток для Windows тощо), і я хочу, щоб це було просте обслуговування / оновлення, маючи бізнес-логіку в одній центральній області. Це відповідний спосіб досягти цього?
Чи повинен рівень Business навіть містити сховища або вони повинні міститись у шарі доступу? Якщо там, де вони є в порядку, передається рядок з'єднання, яку слід припустити?
Дякуємо, що знайшли час для читання!
DbContext
як свою залежність. У бізнес-класах залежність є сховищами. Для введення залежності я це роблю вручну (тому я розумію, що відбувається). Причиною, по якій я хочу мати змогу встановити рядок з'єднання,DbContext
є те, що я використовую базування даних, тому в певних випадках мені потрібно мати структуру об'єкта для підключення до різних баз даних (тієї ж структури). Я вас правильно розумію?