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

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

首先,在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();
}

相关内容

  • 没有找到相关文章

最新更新