AutoFac 构造器多接口

AutoFac constructor multiple Interface

我在我的项目中使用 Autofac。我想用一个简单的界面来解决它们。不是通用存储库。

我在我的旧项目中使用 Castle。它有一个 class 有静态方法。我像这样在我的构造方法中使用它;

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;
        }

我可以想到两种方法来减少构造函数中注入的服务数量。

First,在Autofac中你可以有一个IComponentContext类型的参数,当你的服务从容器实例解析时,IComponentContext依赖自动解析为容器的实例。然后您可以从中解决其余的依赖关系:

// constructor of your component
public MyComponent(IComponentContext components)
{
    _serviceA = components.Resolve<IServiceA>();
    _serviceB = components.Resolve<IServiceB>();
}

顺便说一句,在 Castle Windsor 中,您必须显式注册容器的实例才能使上述方法起作用。

第二种方式 是创建一个"composite" 服务,其中包含应用程序需要的所有(或最常见的)服务。然后注入该服务并从中获取所有其他服务:

// 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();
}