У меня есть слоистое решение следующим образом:Какая опция, отличная от BLL, создающая DAL, допускает модульное тестирование в n-уровневом решении, не подвергая DAL UI или BLL DAL?
- UI (пользовательский интерфейс)
- BLL (Business Logic Layer)
- ВВЛ (уровень доступа к данным)
- SharedEntities (A VS Project с лицом Pocos только)
Я бы хотел, чтобы BLL получил услугу GetProductList(), которая реализована в моем слое DAL. Я думал об определении интерфейса в реализации BLL и DAL следующим образом:
Вариант А:
// Interface defined in BLL
public interface IDataServices
{
List<Product> GetProductList();
}
// Interface implemented in DAL
public class DataServices : IDataServices
{
Public List<Product> GetProductList()
{
return //do some database work here and return List<Product>;
}
}
Если я хочу, чтобы это было реализовано в DAL, то я должен был бы иметь проект DAL ссылаться на BLL, чтобы увидеть определение интерфейса IDataServices. Или я мог бы реплицировать определение интерфейса в DAL, но затем я получу дублированный код для поддержки (то же определение интерфейса в BLL и DAL).
Вариант B: Другой способ, которым я мог бы сделать это забыть идею интерфейса и просто сделать следующий конкретный класс и вызов метода в УСК, который пользовательский интерфейс может использовать:
// Concrete class defined in the BLL
public class DataServices
{
Public List<Product> GetProductList()
{
DAL aDAL = new DAL();
Return (aDAL.GetProductList());
}
}
Это достаточно легко но тогда BLL видит DAL и имеет ссылку на него, но это действительно плохо? Пока BLL не использует какие-либо объекты базы данных (например, источники данных, соединяют строки и т. Д.), Чтобы удовлетворить запрос, а DAL соответствует сопоставлению имен служб, которые я определяю в классе BLL DataServices, недостаточно? Все разговоры, которые я слышу о замене в другом движке базы данных, все равно можно сделать, просто удостоверившись, что следующий DAL предоставляет те же сервисы, которые BLL идентифицирует в классе DataServices, например GetProductList(). В этой настройке пользовательский интерфейс все еще ничего не знает о DAL, и DAL ничего не знает о BLL. Если я принимаю идею использования инъекции зависимостей, чтобы избежать создания экземпляра DAL в BLL, это означало бы, что он должен был бы внедрить его в пользовательский интерфейс, который будет передан в BLL. Я бы не хотел этого делать, чтобы предоставить доступ к интерфейсу DAL.
Вариант C: Я кратко рассмотрел контейнер Unity, но этот инструмент предложил зарегистрировать все интерфейсы и конкретный класс вверх в точке входа, который был бы пользовательским интерфейсом, который, в свою очередь, обеспечивал видимость интерфейса для обоих BLL и DAL, которые выглядели еще хуже. Я видел ссылку на использование MEF с Unity, чтобы обойти проблему точки входа, видя все слои, но также увидел, что если вы это сделаете, вы не сможете полностью протестировать такую конфигурацию. Похоже, что много работы и сложности по сравнению с опцией B.
Опция D: И еще один вариант, о котором я думал, - создать слой фасада (другой проект VS) между BLL и DAL. Это, похоже, не имеет большого смысла, если я не получаю много методов DAL, которые не касались BLL, поэтому они должны были быть скрыты; позволяя DAL Facade показывать только то, что требуется BLL. Если бы мне пришлось поменять местами в другой базе данных, мне все равно пришлось бы создавать методы, которые необходимо было использовать на основе потребностей BLL, как я упоминал в варианте B.
Итак, основываясь на этом, я думаю о том, чтобы пойти с вариантом B, но я бы хотел, чтобы какой-то общественный вклад здесь.Что еще я могу сделать, который отвечает следующим образом:
- 1) Не позволяйте UI увидеть DAL
- 2) Не позволяйте DAL увидеть BLL
- 3) Решение по-прежнему позволяет всем подлежащих тестированию на единицу измерения
BLL (или модель домена) - это самый низкий уровень. Он не должен зависеть от (ссылки) каких-либо других слоев. Бизнес-логика, реализованная в BLL, достаточно сложна, чтобы избежать каких-либо технических сложностей, возникающих на уровне инфраструктуры (DAL и т. Д.). –
@JakubLortz - странная модель. Обычно BLL находится между UI и DAL. Почему DAL (в вашей модели) ссылается на BLL? Почему UI ссылается на DAL? Это то, что вы говорите. – usr
Я отредактировал его, чтобы сказать, что общие объекты - это только проект POCOs, поэтому любой слой может ссылаться на него для компоновки данных. У него нет операций. – Robertcode