1

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

我想要完成的是执行多个作业的 Windows 服务。我有 2 个工作,它们通过短信或电子邮件从队列中发送消息。每项工作都是不同的装配。它们都依赖于 IQueuedMessageProvider。一项工作需要电子邮件实现,另一项需要短信实现。两个工作的构造函数如下所示(为问题而简化):

 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 并在构造函数中采用正确的实现。但我更喜欢在它自己的配置中解决它。甚至有可能,或者您对解决这个问题有什么更好的建议吗?

4

1 回答 1

1

在撰写本文时,Autofac 的 XML 配置能够为服务指定名称/键(如您的消息提供程序),但不能在不同服务的构造函数(“作业”类)上指定给定类型与特定名称相关联。

你实际上有三个选择。

选项 1:重新设计界面

拥有接口(或抽象/基类)的重点是您可以互换使用实现。(请参阅:Liskov 替代原则)如果您的设计无法做到这一点(这就是它的外观),那么重新研究该设计会很好。对于不同的任务,您可能需要不同的界面。

查看提供的小片段,我可能会考虑为每种传输方法(ISmsProvider, IEmailProvider)设置不同的接口,以便处理器“作业”类可以按类型适当地键入。

选项 2:使用 Autofac 模块

如果您有不同的“已知配置”(例如,一种用于开发,一种用于生产),那么您可以为每种配置创建不同的 Autofac 模块。您可以在模块中比在 XML 配置中灵活得多,并且它允许您执行您需要做的花哨的按命名实例连接的事情。

您可以像注册类型一样使用 XML 配置来注册模块,因此不要根据您的不同需求切换 XML 配置类型注册,而是更改 XML 配置以注册不同的模块。

选项 3:实现您自己的 XML 配置解析器

从 Autofac 3.0 开始,配置机制可以编写自己的机制来解析和注册 XML 配置。该网站上的文档尚未完全更新,也没有“食谱”或示例,因此您必须对源代码进行一些探索,但从技术上讲这是可能的。在深入研究这个选项之前,我可能会先看看前两个选项之一。

于 2013-01-25T16:22:14.687 回答