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

标签 c# .net design-patterns interface contract

我有两个需要受契约(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/

相关文章:

java - 我正在尝试理解建筑模式,但我与导演之间存在问题

c# - 是否有工具或策略可以找出项目需要引用的所有 .dll 和 nuget 包?

c# - 如何在 ASP.net Core 中添加基于环境的 DbContext

c# - 如何在 C# MVC 中创建动态复选框列表组?

.net - 无法将仅 http 的 cookie 从 .net api 传递到 next-auth,然后传递到前端

c# - 如何在 c# .net web 应用程序中获取特定的资源字符串而不考虑当前的文化

Java:对外部构造对象的依赖注入(inject)?

c# - Autofac - 动态解析带参数的组件

c# - 为什么这段代码无法验证?

design-patterns - 复杂过程的单一职责原则