gpt4 book ai didi

c# - 回调接口(interface)合约

转载 作者:行者123 更新时间:2023-11-30 12:11:53 31 4
gpt4 key购买 nike

我有两个需要受契约(Contract)约束的 .NET 方。现在,party1 和 party2 需要能够相互调用一些方法(大部分是调用和报告结果)。我有双工契约(Contract),但双方没有使用 WCF。

有这方面的设计模式吗?

编辑

各方是同一个应用程序的一部分。我创建了应用程序 (party1),其他人创建了我动态加载的 dll (party2)。现在,我们双方都应该能够相互调用方法。所以,我打算在我们之间创建一个接口(interface)契约(Contract)。目的是了解是否有已知模式可以做到这一点?

最佳答案

一个常见的解决方案是使用某种发布/订阅模式。这样做可以避免循环依赖。

基本上,您创建了某种用于订阅事件(并发布它们)的类。

所以你的两个类都做这样的事情(但事件不同):

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

关于c# - 回调接口(interface)合约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14501805/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com