回调接口合同

时间:2013-01-24 12:51:07

标签: c# .net design-patterns interface contract

我有两个需要受合同约束的.NET方。现在,party1和party2需要能够相互调用某些方法(大多数是调用和报告结果)。我有双工合同,但各方都没有使用WCF。

这有设计模式吗?

修改

双方是同一申请的一部分。我创建了应用程序(party1),其他人创建了一个动态加载的DLL(party2)。现在,我们俩都应该能够相互调用方法。所以,我想在我们之间创建一个接口契约。目的是知道是否有一个知道模式来做到这一点?

2 个答案:

答案 0 :(得分:3)

常见的解决方案是使用某种发布/子模式。通过这样做,您可以避免循环依赖。

基本上你创建了一些用于订阅事件(并发布它们)的类。

所以你们的类都做这样的事情(但是有不同的事件):

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;
}

瞧。这两个类现在彼此松散耦合(虽然仍能够相互通信)


如果您使用控制容器的反转,它会更容易,因为您可以简化事件管理器并只使用容器(服务位置)来解析所有订阅者:

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);
        }
    }
}

答案 1 :(得分:0)

我认为你可以使用下一个逻辑:

 Class1: Interface1 , Class2:Interface2, 

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

}

这种方式让我想起模式Bridge,但这是非常主观的