CSharp - AutoFac构造函数多重接口

  显示原文与译文双语对照的内容
0 0

我在项目中使用 Autofac 。 我想用一个简单的接口来解决它们。 非通用存储库。

我在旧项目中使用 Castle 。 它有一个具有 static 方法的类。 我在构造函数方法中使用了它;


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

时间: 原作者:

0 0

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

如果你从容器实例中得到一个参数,则在Autofac中自动解析为容器实例的IComponentContext 依赖。 然后,你可以从它解析剩下的依赖项:


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

你必须在 max Windsor 中显式地对容器实例进行 register 操作,以使上述方法能够工作。

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


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

请注意,必须在容器中 register 和内部服务之间进行。

现在你的构造函数中只能有一个参数:


public MyComponent(ICommonServices services)
{
 _services = services;
}

使用内部服务:


public void SomeMethod()
{
 _services.ServiceA.DoSomething();
}

...