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