让我们说我有EmailService来支持IEmailService。并且EmailService对ILoggingService具有构造函数依赖性。既然我有几个ILoggingService的实现,可以实现这样的事情:
<component service="IEmailService, MyInterfaces" type="EmailService, MyLib">
<parameters>
<parameter name="loggingService" value="LoggingService, MyLib" />
</parameters>
</component>
我已经考虑过给已注册类型命名,但到目前为止找不到如何从XML配置中使用它们的示例。
简而言之,我想使用XML配置来指定注入哪个具体的记录器实现。
答案 0 :(得分:3)
XML configuration in Autofac更多地针对80%的用例,而不是完全实现Autofac在XML格式中的灵活性。 Autofac instead recommends using its module mechanism用于配置。模块与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);
}
}
请注意,注册要复杂得多,因为您需要非常具体的解决方案。
现在在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>
如果要切换配置,请注册其他模块,而不是摆弄特定的组件注册表。
代码免责声明:我正在从内存中编写语法而且我不是编译器,所以你可能需要做一些调整 ......但前提是这样。 隔离模块中的复杂性,然后注册模块。