2011-08-09 12 views
5

私は2つのプロジェクトを持っています。 ProjectAにはTaskというクラスがあり、projectBにはTransmissionというクラスがあります。私は、Transmissionが変更されたときはいつでも、Taskで何かが起こり、Taskが変更されたときはいつでも、何かがTransmissionで起こるようにしたいと思います。プロジェクト間でやりとりする

私は、ProjectAとprojectBの両方に参照があるCommonという別のプロジェクトを作成しました。私はすべてのインターフェイスを両方のエンティティ間で相互作用させるのが一般的です。

共通プロジェクトでは、私はProjectAが実装するIManagerというインターフェースを作成しました。 Managerの役割は、更新を処理することです。このようなインタフェースのルック:

public interface IManager 
{ 
    ITaskChangedHandler TaskChangedHandler { set; } 

    void OnTransmissionChanged(ITransmissionWithTasks transmission); 
} 

このインタフェースはPROJECTAが実装しなければならない2つの方法があります

  1. void OnTransmissionChanged(ITransmissionWithTasks transmission); この方法はするために呼び出される(ProjectBの内部)送信に変更がありますタスクの更新を行います。

  2. ITaskChangedHandler TaskChangedHandler { set; } IManagerの実装では、ITaskChangedHandlerに設定する必要があります。 ITaskChangedHandlerタスクの場合に更新伝送のための方法を定義するインタフェースが変更されている:今

    public interface ITaskChangedHandler 
    { 
        void OnTaskChanged(string moduleName, ITask task, long transmissionId); 
    } 
    

、それはこのように書き:

  1. PROJECTAがiManagerのに実装されています。

  2. 私はiManagerの実装のインスタンスを受信し、これは私の問題であるOnTransmissionChanged();

  3. を呼び出すためのStructureMapを使用して伝送におけるcahngeがある時はいつでも - (PROJECTA中)タスクに変更があるたびに私はしたいと思いますが、 IManager実装のTaskChangedHandler.OnTaskChanged()を呼び出します。しかし、問題は、IManager実装のインスタンスがTaskChangedHandlerを設定しないことです。
    私はこのTaskChangedHandlerを設定する必要がどこにもわかりません:それはITaskChangedHandlerの実装を知らないので

    • これはPROJECTAにすることはできません。

    • IManagerの実装がProjectAで行われるため、これはProjectBには存在しない可能性があります。そのため、projectAにセットする必要があります。

    • これは、IManagerとITaskChangedHandlerの実装がわからないため、共通プロジェクトにはありません。

誰もがこの問題を解決するために私を助けることができますか?

答えて

2

ここでは、あなたが思うかもしれないクイックアンドダーティな方法があります。静的な共有クラスです。共有アセンブリで定義できます。FirstEventを処理する

public static class SharedEvents 
{ 
    public delegate void FirstEventHandler(); 
    public delegate void SecondEventHandler(); 

    public static event FirstEventHandler FirstEvent; 
    public static event FirstEventHandler SecondEvent; 

    public static void OnFirstEvent() 
    { 
     if (FirstEvent != null) FirstEvent(); 
    } 

    public static void OnSecondEvent() 
    { 
     if (!SecondEvent != null) SecondEvent(); 
    } 
} 

つのレジスタ、SecondEventを処理するために別の:従ってOnFirstEvent()又はOnSecondEvent()を呼び出し、お互いを呼び出します。

これは、Mediatorパターンのシンプルな、とかなり貧弱、実装です:依存性の注入で

http://en.wikipedia.org/wiki/Mediator_pattern

、あなたも、共有インターフェイスに基づいてオブジェクトにインスタンスを取得することができます。たとえばNinjectでは、IFirstのハンドラを定数(IFirstを実装するものの特定のインスタンス)またはその逆のハンドラとして登録することができます。その後、それをつかむためにGet<IFirst>に電話してください。

+1

静的(または静的ではない)メディエータを使用するか、または依存性注入で両方の方法を使用する方が良いと思いますか? – Naor

+0

もう一度考えると、この仲介者は静的でなければなりません。各プロジェクトはイベントを登録する必要があり、静的でない場合は登録するインスタンスがありません。私は正しい? – Naor

+1

依存関係注入を介してシングルトンを使用する場合、静的である必要はありません。例えば、「Get 」を取得して、同じインスタンスを元に戻すことができます。静的は私の意見ではかなり醜いです。メディエイターは、それを使用する前に登録する必要があります。つまり、タスクをITaskの実装、IT伝送のトランスミッションとして登録することができ、DIを使用して相互にアクセスできるため、DIを使用するメディエータは必要ありません。 –

関連する問題