4

契約に拘束される必要がある 2 つの .NET 関係者がいます。ここで、party1 と party2 は、互いにいくつかのメソッドを呼び出すことができる必要があります (そのほとんどは、呼び出しと結果の報告です)。二重契約を念頭に置いていますが、当事者は WCF を使用していません。

このための設計パターンはありますか?

編集

当事者は同じアプリケーションの一部です。私がアプリケーション (party1) を作成し、他の誰かが私が動的にロードする dll (party2) を作成します。これで、お互いにメソッドを呼び出すことができるはずです。それで、私は私たちの間のインターフェース契約を作成しようとしています。その意図は、それを行うための既知のパターンがあるかどうかを知ることですか?

4

2 に答える 2

3

一般的な解決策は、ある種の pub/sub パターンを使用することです。そうすることで、循環依存を避けることができます。

基本的に、イベントをサブスクライブする (およびそれらを公開する) ために使用されるある種のクラスを作成します。

したがって、両方のクラスが次のようなことを行います (ただし、イベントは異なります)。

public class ClassA : IEventHandler<UserCreated>
{
    IEventManager _eventManager

    public ClassA(IEventManager manager)
    {
       // I subscribe on this event (which is published by the other class)
       manager.Subscribe<UserCreated>(this);
       _eventManager = manager;
    } 

    public void Handle(UserCreated theEvent)
    {
        //gets invoked when the event is published by the other class
    }

    private void SomeInternalMethod()
    {
        //some business logic

        //and I publish this event
        _eventManager.Publish(new EmailSent(someFields));
    }
}

イベント マネージャー (簡略化され、スレッド セーフではありません):

public class EventManager
{
    List<Subscriber> _subscribers = new List<Subscriber>();

    public void Subscribe<T>(IEventHandler<T> subscriber)
    {
        _subscribers.Add(new Subscriber{ EventType = typeof(T), Subscriber = subscriber});
    }

    public void Publish<T>(T theEvent)
    {
        foreach (var wrapper in subscribers.Where(x => x == typeof(theEvent)))
        {
            ((IEventHandler<T>)wrapper.Subscriber).Handle(theEvent);
        }
    }
}

小さなラッパー:

public class Subscriber
{
    public Type EventType;
    public object Subscriber;
}

出来上がり。2 つのクラスは疎結合になりました (相互に通信することはできます)。


コントロール コンテナーの反転を使用すると、イベント マネージャーを単純化し、コンテナー (サービスの場所) を使用してすべてのサブスクライバーを解決できるため、より簡単になります。

public class EventManager
{
    IYourContainer _container;

    public EventManager(IYourContainer container)
    {
        _container = container;
    }

    public void Publish<T>(T theEvent)
    {
        foreach (var subscriber in _container.ResolveAll<IEventHandler<T>>())
        {
            subscriber.Handle(theEvent);
        }
    }
}
于 2013-01-25T09:07:14.010 に答える
0

次のロジックを使用できると思います:

 Class1: Interface1 , Class2:Interface2, 

class Manager{
   public Manager(Interface1 managedPart1,Interface2 managedPart2){
        ... some logic for connect to interfaces
   }

}

このように私はパターンを思い出しますBridgeが、これは非常に主観的です

于 2013-01-25T09:24:46.450 に答える