最初我只需要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();
}
这是一个糟糕的设计吗?怎么可以重构?
答案 0 :(得分:1)
我不会考虑这个糟糕的设计。您需要提供队列名称并将其作为appSetting使用,以便在需要时更新它们。
它也感觉就像摩擦力较小的路径,总是很好,但是我不太喜欢它,因为每次添加新名称都需要更改界面,这不是那么好。
我发现这篇文章有一些你可能感兴趣的答案:
IoC - Multiple implementations support for a single interface