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();
}
Другие вопросы по тегам