是否可以使用autofac xml配置配置同一接口的多个实现?
我想要完成的是一个执行多个作业的Windows服务。我有2个工作,通过短信或电子邮件从队列发送消息。每个工作都是不同的组装。它们都依赖于IQueuedMessageProvider。一个工作需要电子邮件实现,另一个工作需要sms实现。两个工作的构造函数看起来像这样(简化问题):
public SendSmsJob(IQueuedMessageProvider queuedMessageProvider)
{
_queuedMessageProvider= queuedMessageProvider;
}
public SendEmailJob(IQueuedMessageProvider queuedMessageProvider)
{
_queuedMessageProvider= queuedMessageProvider;
}
在app.config中我注册了像
这样的实现<component type="MyApp.Plugin.Sms.Verizon.VerizonSmsService, MyApp.Plugin.Sms.Verizon" service="MyApp.Model.Messages.QueuedMessages.Providers.IQueuedMessageProvider, MyApp.Model" />
<component type="MyApp.Plugin.Email.Smtp.EmailService, MyApp.Plugin.Email" service="MyApp.Model.Messages.QueuedMessages.Providers.IQueuedMessageProvider, MyApp.Model" />
如何确保作业能够正确实现de IQueuedMessageProvider?我已经阅读过有关使用名称和键https://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices解决这些问题的文章。
另一个选项是注册所有实现并使IQueuedMessageProvider成为IEnumerable并在构造函数中采用正确的实现。但我更喜欢在配置中解决它。是否有可能或者你有什么更好的建议来解决这个问题?
答案 0 :(得分:1)
Autofac的XML配置在撰写本文时,能够为服务指定名称/密钥(如消息提供者),但不能在不同服务的构造函数上指定给定类型(“作业” “类”与特定名称相关联。
您实际上有三种选择。
选项1:重新设计界面
拥有接口(或抽象/基类)的关键是您可以交替使用实现。 (请参阅:Liskov substitution principle。)如果您的设计不能这样做(它出现的方式),那么重新调查该设计会更好。您可能需要不同的接口来完成不同的任务。
查看提供的小代码片段,我可能会考虑为每种传输方法(ISmsProvider
,IEmailProvider
)设置不同的接口,因此处理器“作业”类可以按类型进行适当的键控。
选项2:使用Autofac模块
如果您有不同的“已知配置”(例如,一个用于开发,一个用于生产),则每个配置可以create different Autofac modules。您可以在模块中比在XML配置中更灵活,并且它允许您执行您需要执行的花哨的逐行命名实例。
您可以使用XML配置为类型注册模块,因此,不是根据您的不同要求切换XML配置类型注册,而是更改XML配置以注册不同的模块。
选项3:实现您自己的XML配置解析器
从Autofac 3.0开始,配置机制可以编写自己的机制来解析和注册XML配置。网站上的文档尚未更新,并且没有“食谱”或样本,因此您必须在源代码中进行一些洞察,但从技术上讲,它是可能的。在深入研究这个选项之前,我可能会先看看前两个选项中的一个。