0

我有一個場景,我們正在接收XML消息。我需要查看消息的頭部以確定它是什麼消息類型/版本(來自遺留系統)。我希望能夠註冊消息類型然後傳入參數來解析特定的類型。我是DI/Unity的新手(如果你沒有注意到),所以我可能會嘗試應用一個不好的練習或不正確地接近它。想要從我們正在使用的現有工廠模式中實現這一目標。C#Unity - 動態解析註冊類型

這顯然作品:

XDocument xml = XDocument.Load(@"D:\Demos\XmlMessages\AllMessages\LogEvent.xml"); 
    var container = new UnityContainer(); 

    //Base Works 
    container.RegisterType<IMessage, LogEvent>(new InjectionProperty("XmlDoc", xml)); 
    var baseMessage = container.Resolve<BaseMessage>(); 
    baseMessage.ParseDocument(); 

不知道如何申請這兒的動態分辨率?:

XDocument xml = XDocument.Load(@"D:\Demos\XmlMessages\AllMessages\LogEvent.xml"); 
var container = new UnityContainer(); 
    container.RegisterType<IMessage, LogEvent>("LogEvent", new InjectionProperty("XmlDoc", xml)); 
    var baseMessage = container.Resolve(typeof(IMessage), "LogEvent"); 

    baseMessage.ParseDocument(); //Just returning type so obviously can't run this 

正在註冊我的信息是正確的做法?如果是這樣,那麼我怎麼才能完成解決我的BaseMessage,所以我可以調用ParseDocument?

任何信息/建議非常感謝。

編輯: 我已經有一個類,將解析XML的頭和餵我的版本和類型(因此,例如,它會告訴我,這是一個「的LogEvent」消息)。這就是爲什麼我正在考慮使用DI是因爲我可以簡單地將解析的值(在本例中爲「LogEvent」)傳遞給Resolver,只是想根據Sebastian的反應進行更新。即使這種情況不適用,我應該堅持工廠方法。我想了解這種類型的動態調用的將是可能的。

感謝,

小號

+1

您可能會發現這一點相關:http://blog.ploeh.dk/2011/09/19/MessageDispatchingWithoutServiceLocation.aspx –

回答

0

以下是我必須要解決的問題。這工作:

獲取Xml和定義容器:

XDocument xml = XDocument.Load(@"D:\Demos\XmlMessages\AllMessages\LogEvent.xml"); 
var container = new UnityContainer(); 

註冊:

container.RegisterType<IMessage, LogEvent>("LogEvent", new InjectionProperty("XmlDoc", xml)); 

通過註冊域名解析(下解決部分是我做錯了)

var baseMessage = container.Resolve<IMessage>("LogEvent"); 
    baseMessage.ParseDocument(); 
2

我建議你還是堅持使用了工廠。一個DI容器不是一個工廠對於業務對象而言,它可以幫助您組成鬆散耦合的應用程序。您可以將工廠注入需要處理傳入消息的類。但不要試圖將邏輯弄清楚如何處理XML到容器中。


更新

如果你已經有一個機制來得到的消息對象,您既可以使用一個簡單的調用Activator.CreateInstance和完全無視團結的具體Type

或者,因爲你有可用的容器的實例,調用

object msg = container.Resolve(typeof(LogEvent)); 

此方法返回一個object。如果你知道你會得到一些基類的實例,你可以將它轉換爲Type

如果消息Type是一個具體類(不是接口或抽象類),Unity將找出如何創建該Type的實例。

+0

Thanks @Seb astianWeber ....看看我的編輯。只是想獲得您的輸入 – scarpacci

+0

這實際上是我目前正在做的是使用反射來調用「Activator.CreateInstance」。我會看看你上面的對象例子。謝謝Sebastion。 – scarpacci