2013-01-24 76 views
1

是否可以使用autofac xml配置配置同一接口的多个实现?Autofac多实现xml配置

我想完成的是一个windows服务,它执行多个工作。我有2个通过短信或电子邮件从队列发送消息的作业。每一份工作都是不同的程序集。它们都依赖于IQueuedMessageProvider。一个作业需要的电子邮件执行另外一个短信implementation.The构造为两个作业看起来就像这样(简化问题):

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" /> 

如何确保工作得到IQueuedMessageProvider的正确实施?我已阅读有关解决这些与名称和键https://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices的问题。

另一个选项是注册所有实现并使IQueuedMessageProvider成为IEnumerable并在构造函数中采用正确的实现。但我更愿意在自己的配置中解决它。它甚至有可能,或者你有什么更好的解决这个问题的建议?

回答

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配置。网站上的文档还没有更新,而且没有“食谱”或样本,所以你需要在源代码中进行一些洞察,但从技术上来说这是可能的。在深入研究这个之前,我可能会先看看前两个选项之一。

+0

我认为你对重新设计接口是正确的。我没有任何意义,电子邮件作业开始发送短信。虽然它在技术上很好,但它永远不会发生。感谢您指出我的设计错误。 – Mark