我有两个需要受合同约束的 .NET 方。现在,party1 和party2 需要能够相互调用一些方法(大部分是调用和报告结果)。我有双工合同,但双方没有使用 WCF。
这有设计模式吗?
编辑
双方是同一申请的一部分。我创建了应用程序 (party1),其他人创建了一个动态加载的 dll (party2)。现在,我们俩应该能够互相调用方法。所以,我要在我们之间创建一个接口契约。目的是知道是否有一个知道模式可以做到这一点?
我有两个需要受合同约束的 .NET 方。现在,party1 和party2 需要能够相互调用一些方法(大部分是调用和报告结果)。我有双工合同,但双方没有使用 WCF。
这有设计模式吗?
编辑
双方是同一申请的一部分。我创建了应用程序 (party1),其他人创建了一个动态加载的 dll (party2)。现在,我们俩应该能够互相调用方法。所以,我要在我们之间创建一个接口契约。目的是知道是否有一个知道模式可以做到这一点?
一个常见的解决方案是使用某种 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;
}
瞧。这两个类现在彼此松散耦合(同时仍然能够相互通信)
如果您使用控制反转容器,它会变得更容易,因为您可以简化事件管理器并仅使用容器(服务位置)来解析所有订阅者:
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);
}
}
}
我认为您可以使用下一个逻辑:
Class1: Interface1 , Class2:Interface2,
class Manager{
public Manager(Interface1 managedPart1,Interface2 managedPart2){
... some logic for connect to interfaces
}
}
这种方式让我想起了模式Bridge
,但这是非常主观的