AutoFac конструктор нескольких интерфейсов
Я использую Autofac в своем проекте. Я хочу использовать простой интерфейс для их решения. Не универсальный репозиторий.
Я использовал Castle в своих старых проектах. У него есть класс, у которого есть статические методы. Я использовал это в своем методе конструктора, как это;
IService.ProductService.GetMyProducts();
В Autofac я не мог найти ничего подобного выше. Пожалуйста, помогите мне. Я не хочу использовать много интерфейсов в моем конструкторе.
private IGeneralRepository generalRep;
private IDenemeRepository denemeRep;
private IGokberkRepository GokberkRep;
public HomeController(IDenemeRepository dr,IGokberkRepository gr, IGeneralRepository ger)
{
generalRep = ger;
denemeRep = dr;
GokberkRep = gr;
}
1 ответ
Я могу придумать два способа уменьшить количество внедренных сервисов в вашем конструкторе.
Во-первых, в Autofac вы можете иметь один параметр типа IComponentContext
и когда ваш сервис разрешен из экземпляра контейнера, IComponentContext
зависимость автоматически разрешается для экземпляра контейнера. Затем вы можете решить остальные ваши зависимости от него:
// constructor of your component
public MyComponent(IComponentContext components)
{
_serviceA = components.Resolve<IServiceA>();
_serviceB = components.Resolve<IServiceB>();
}
Кстати, в Castle Windsor вам пришлось явно зарегистрировать экземпляр контейнера, чтобы заставить работать вышеуказанный метод.
Второй способ - создание одного "составного" сервиса, который содержит все (или наиболее распространенные) сервисы, необходимые приложению. Затем внедрите этот сервис и получите от него все остальные:
// composite service - implement this interface as shown below
public interface ICommonServices
{
IServiceA ServiceA { get; }
IServiceB ServiceB { get; }
}
Реализация составного сервиса:
// a class that implements ICommonServices interface
public class CommonServices : ICommonServices
{
public CommonServices(IServiceA serviceA, IServiceB serviceB)
{
this.ServiceA = serviceA;
this.ServiceB = serviceB;
}
public IServiceA ServiceA { get; private set; }
public IServiceB ServiceB { get; private set; }
}
Обратите внимание, что вы должны зарегистрировать составной сервис и внутренние сервисы в контейнере.
Теперь в вашем конструкторе может быть только один параметр:
public MyComponent(ICommonServices services)
{
_services = services;
}
Используя внутренние сервисы:
public void SomeMethod()
{
_services.ServiceA.DoSomething();
}