2013-01-24 101 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