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を呼び出すことができますか?

大変感謝しています。

EDIT: (例えば、これは「のLogEvent」メッセージであることを私に教えてくれるので)私はすでにXMLのヘッダを解析して、私のバージョンと種類を養うクラスを持っています。それで私がDIを利用することを検討していた理由は、解析された値(この場合は "LogEvent"をResolverに渡すことができただけです)です。このシナリオが適用されない場合でも、ファクトリメソッド。私は、動的呼び出しのこのタイプが可能であるかを理解したいと思います。

おかげで、

S

+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を返す

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

を呼び出します。いくつかの基本クラスのインスタンスを取得することがわかっている場合は、それをTypeにキャストできます。

メッセージTypeが具体的なクラス(インターフェイスまたは抽象クラスではない)であれば、UnityはそのTypeのインスタンスの作成方法を理解します。

+0

ありがとう@Seb astianWeber ....私の編集を見てください。ちょうどあなたの入力を取得したかった – scarpacci

+0

これは実際に私が現在行っているのはReflectionを使って "Activator.CreateInstance"を呼び出すことです。私は上記のあなたのオブジェクトの例を見ていきます。ありがとうSebastion。 – scarpacci

関連する問題