Пытаясь выяснить, как лучше обрабатывать следующий сценарий:Dependency Injection и завод
Предположим RequestContext
класс, который имеет зависимость для внешней службы, такие как:
public class RequestContext : IRequestContext
{
private readonly ServiceFactory<IWeatherService> _weatherService;
public RequestContext(ServiceFactory<IWeatherService> weatherService, UserLocation location, string query)
{
_weatherService = weatherService;
...
Какого рода зависимость должен ли я требовать в классе, который в конечном итоге будет создавать экземпляр RequestContext
? Это может быть ServiceFactory<IWeatherService>
, но это не кажется правильным, или я мог бы создать IRequestContextFactory
для него вдоль линий:
public class RequestContextFactory : IRequestContextFactory
{
private readonly ServiceFactory<IWeatherService> _weatherService;
public RequestContextFactory(ServiceFactory<IWeatherService> weatherService)
{
_weatherService = weatherService;
}
public RequestContext Create(UserLocation location, string query)
{
return new RequestContext(_weatherService, location, query);
}
}
А затем пройти через IRequestContextFactory
инъекции конструктора.
Это похоже на хороший способ сделать это, но проблема с этим подходом заключается в том, что я считаю, что это препятствует обнаружению (разработчики должны знать о фабрике и реализовывать ее, что на самом деле не очевидно).
Есть ли лучший/более доступный способ, который мне не хватает?
Интересно, я не думал о том, чтобы вводить RequestContext напрямую, потому что его параметры будут различаться при каждом запросе страницы (ASP.NET MVC). Было бы неплохо использовать NInject для правильного создания класса для меня, например, в строку запроса? Или я бы настроил NInject на использование фабрики, которая возвращает экземпляр, но на базовом уровне просто вводит RequestContext? – andreialecu
Я еще не знаю Ninject достаточно хорошо, чтобы ответить на специфику этого, но если он не поддерживает это напрямую, вы всегда можете реализовать эту небольшую часть самостоятельно, используя абстрактную фабрику, введенную в потребитель более высокого уровня. –