Autofac是否允许指定应注入构造函数的依赖项类型
假设我有EmailService,它包含IEmailService。EmailService对ILogingService具有构造函数依赖性。现在,考虑到我有几个ILogingService的实现,我可以实现如下功能:Autofac是否允许指定应注入构造函数的依赖项类型,autofac,Autofac,假设我有EmailService,它包含IEmailService。EmailService对ILogingService具有构造函数依赖性。现在,考虑到我有几个ILogingService的实现,我可以实现如下功能: <component service="IEmailService, MyInterfaces" type="EmailService, MyLib"> <parameters> <parameter name="loggingServi
<component service="IEmailService, MyInterfaces" type="EmailService, MyLib">
<parameters>
<parameter name="loggingService" value="LoggingService, MyLib" />
</parameters>
</component>
我已经研究过为注册的类型命名,但到目前为止,还没有找到如何从XML配置中使用它们的示例
简而言之,我想使用XML配置来指定注入哪个具体的记录器实现。更多地针对80%的用例,而不是以XML形式完全实现Autofac的灵活性。用于配置。模块,再加上XML配置,可以是一种非常强大的方式来实现您希望实现的目标,并且仍然具有根据需要在依赖项之间切换的灵活性
首先,创建进行所需注册的Autofac模块:
public class EmailModule
{
protected override void Load(ContainerBuilder builder)
{
// Register a named logging service so we can locate
// this specific one later.
builder.RegisterType<LoggingService>()
.Named<ILoggingService>("emailLogger");
// Create a ResolvedParameter we can use to force resolution
// of the constructor parameter to the named logger type.
var loggingServiceParameter = new ResolvedParameter(
(pi, ctx) => pi.Name == "loggingService",
(pi, ctx) => ctx.ResolveNamed<ILoggingService>("emailLogger"));
// Add the ResolvedParameter to the type registration so it
// knows to use it when resolving.
builder.RegisterType<EmailService>()
.As<IEmailService>()
.WithParameter(loggingServiceParameter);
}
}
公共类电子邮件模块
{
受保护的覆盖无效负载(ContainerBuilder builder)
{
//注册一个命名的日志服务,以便我们可以找到
//这是一个具体的问题。
builder.RegisterType()
。名为(“电子邮件记录者”);
//创建可用于强制解析的ResolvedParameter
//将构造函数参数的值设置为命名的记录器类型。
var loggingServiceParameter=新解析的参数(
(pi,ctx)=>pi.Name==“loggingService”,
(pi,ctx)=>ctx.ResolveNamed(“emailLogger”);
//将ResolvedParameter添加到类型注册中,以便
//知道在解析时使用它。
builder.RegisterType()
.As()
.带参数(loggingServiceParameter);
}
}
注意,注册有点复杂,因为你需要一个非常具体的分辨率
现在在XML配置中,注册该模块:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section
name="autofac"
type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
</configSections>
<autofac>
<modules>
<module type="EmailModule, MyAssembly" />
</modules>
</autofac>
</configuration>
当您想要切换配置时,请注册不同的模块,而不是摆弄特定的组件注册表
代码免责声明:我是从内存编写语法的,我不是编译器,所以你可能需要做一些调整。。。但前提是成立的隔离模块中的复杂性,然后注册您的模块。谢谢您的回答。我对此感到害怕,并希望找到一种方法,不必为每一个这样的情况编写模块。现在我将使用unity,因为它支持这种xml配置。