Мы создаем проект ASP.NET и инкапсулируем всю нашу бизнес-логику в классы обслуживания. Некоторые из них находятся в доменных объектах, но обычно они довольно анемичны (из-за того, что мы используем ORM, это не изменится). Чтобы лучше включить модульное тестирование, мы определяем интерфейсы для каждого сервиса и используем D.I .. Например. вот пара интерфейсов:
IEmployeeService
IDepartmentService
IOrderService
...
Все методы в этих сервисах - это, в основном, группы задач, и классы не содержат закрытых переменных-членов (кроме ссылок на зависимые сервисы). Прежде чем беспокоиться о модульном тестировании, мы просто объявили бы все эти классы как статические и попросили бы их вызывать друг друга напрямую. Теперь мы настроим класс следующим образом, если сервис зависит от других сервисов:
public EmployeeService : IEmployeeService
{
private readonly IOrderService _orderSvc;
private readonly IDepartmentService _deptSvc;
private readonly IEmployeeRepository _empRep;
public EmployeeService(IOrderService orderSvc
, IDepartmentService deptSvc
, IEmployeeRepository empRep)
{
_orderSvc = orderSvc;
_deptSvc = deptSvc;
_empRep = empRep;
}
//methods down here
}
Это обычно не проблема, но мне интересно, почему бы не создать фабричный класс, который мы вместо этого раздаем?
т.е.
public ServiceFactory
{
virtual IEmployeeService GetEmployeeService();
virtual IDepartmentService GetDepartmentService();
virtual IOrderService GetOrderService();
}
Тогда вместо звонка:
_orderSvc.CalcOrderTotal(orderId)
мы бы позвонили
_svcFactory.GetOrderService.CalcOrderTotal(orderid)
В чем недостаток этого метода? Это все еще проверяемое, оно все еще позволяет нам использовать D.I. (и обрабатывать внешние зависимости, такие как контексты базы данных и отправители электронной почты через D.I. внутри и за пределами фабрики), и это устраняет большую часть D.I. настроить и консолидировать зависимости подробнее.
Спасибо за ваши мысли!