注入具有多个构造函数参数的工厂

时间:2016-06-07 14:38:26

标签: c# .net design-patterns dependency-injection simple-injector

最初我只需要MessageQueueFactory创建一个队列:

container.RegisterSingleton<IMessageQueueFactory>(() => {
    var uploadedWaybillsQueuePath = ConfigurationManager
        .AppSettings["msmq:UploadedDocumentsQueuePath"];
    return new MessageQueueFactory(uploadedWaybillsQueuePath);
});

现在需求发生了变化,需要支持多个队列。

我在这里可以做的最简单的事情是将其他路径(存储在 app.config 中)添加到工厂的构造函数中,并为每个队列提供方法:

container.RegisterSingleton<IMessageQueueFactory>(() => {
    var uploadedDocsQueuePath = ConfigurationManager
        .AppSettings["msmq:UploadedDocumentsQueuePath"];
    var requestedDocsQueuePath = ConfigurationManager
        .AppSettings["msmq:RequestedDocumentsQueuePath"];

    return new MessageQueueFactory(
        uploadedWaybillsQueuePath,
        requestedDocsQueuePath
    );
});

interface IMessageQueueFactory {
    MessageQueue CreateUploadedDocsQueue();
    MessageQueue CreateRequestedDocsQueue();
}

这是一个糟糕的设计吗?怎么可以重构?

1 个答案:

答案 0 :(得分:1)

我不会考虑这个糟糕的设计。您需要提供队列名称并将其作为appSetting使用,以便在需要时更新它们。

它也感觉就像摩擦力较小的路径,总是很好,但是我不太喜欢它,因为每次添加新名称都需要更改界面,这不是那么好。

我发现这篇文章有一些你可能感兴趣的答案:

IoC - Multiple implementations support for a single interface