Я знаю, что принял ответ @Mark Seeman некоторое время назад, но у меня наконец-то появилось время, чтобы реализовать это сейчас, поэтому подумал, что поделюсь тем, что я на самом деле сделал, для пользы других.
По сути, ясоздал интерфейсы-обертки для «групп» зависимостей в моем приложении.
Пример:
public interface ICoreServicesDependencyGroup
{
IUnitOfWork UnitOfWork { get; }
IAspNetMvcLoggingService LoggingService { get; }
}
И реализация:
public class CoreServicesDependencyGroup : ICoreServicesDependencyGroup
{
private readonly IAspNetMvcLoggingService _loggingService;
private readonly IUnitOfWork _unitOfWork;
public CoreServicesDependencyGroup(
IAspNetMvcLoggingService loggingService,
IUnitOfWork unitOfWork)
{
Condition.Requires(loggingService).IsNotNull();
Condition.Requires(unitOfWork).IsNotNull();
_loggingService = loggingService;
_unitOfWork = unitOfWork;
}
public IUnitOfWork UnitOfWork { get { return _unitOfWork; } }
public IAspNetMvcLoggingService LoggingService { get { return _loggingService; } }
}
Довольно просто на самом деле.
Затем я обновил свои контроллеры.
Пример ctor До:
public LocationController(
IUnitOfWork unitOfWork,
IAspNetMvcLoggingService loggingService,
ILocationService locationService,
ICachedLocationService cachedLocationService)
{
_unitOfWork = unitOfWork;
_loggingService = loggingService;
_locationService = locationService;
_cachedLocationService = cachedLocationService;
}
После:
public LocationController(
ICoreServicesDependencyGroup coreServicesDependencyGroup,
ILocationDependencyGroup locationDependencyGroup)
{
_unitOfWork = coreServicesDependencyGroup.UnitOfWork;
_loggingService = coreServicesDependencyGroup.LoggingService;
_locationService = locationDependencyGroup.Service;
_cachedLocationService = locationDependencyGroup.CachedService;
}
Ничего особенного, просто набор оберток.Внутри контроллеров все еще используются те же зависимости, но сигнатура ctor намного меньше, более читабельна, а также облегчает модульное тестирование.