我在项目中使用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();
}