c# - 开放满足多接口(interface)的通用单例服务注册

标签 c# .net dryioc

我正在研究如何在 DI 容器中直接实现事件聚合器,并努力研究如何使用 DryIoC 实现这一点。

我有以下用于事件聚合的示例服务和契约(Contract):

public class EventHub<T> : IPublisher<T>, ISubscriber<T>
{
    private List<Action<T>> listeners = new List<Action<T>>();

    public void Publish(T data)
    {
        foreach (var listener in listeners)
        {
            listener(data);
        }
    }

    public void Register(Action<T> listener)
    {
        listeners.Add(listener);
    }

    public void Unregister(Action<T> listener)
    {
        listeners.Remove(listener);
    }
}

public interface IPublisher<T>
{
    void Publish(T data);
}

public interface ISubscriber<T>
{
    void Register(Action<T> listener);

    void Unregister(Action<T> listener);
}

现在,如果有人为特定类型解析发布者或订阅者,我希望 DI 容器始终返回相同的事件中心。

我尝试了多个 EventHub 类的注册,但它们都有各自的特定问题:

单独注册

Container.Register(typeof(IPublisher<>), typeof(EventHub<>), Reuse.Singleton);
Container.Register(typeof(ISubscriber<>), typeof(EventHub<>), Reuse.Singleton);

这里的问题是 DryIoC 不耦合注册,即对于每种类型,将有两个实现。

注册映射

Container.Register(typeof(EventHub<>), typeof(EventHub<>), Reuse.Singleton);
Container.RegisterMapping(typeof(IPublisher<>), typeof(EventHub<>));
Container.RegisterMapping(typeof(ISubscriber<>), typeof(EventHub<>));

DryIoC (v2.12.10) 不支持,并在尝试注册第一个开放的通用映射时抛出错误消息。

注册多个

Container.RegisterMany(new [] {typeof(IPublisher<>), typeof(ISubscriber<>)}, typeof(EventHub<>), Reuse.Singleton);

这确实有效,但仍然为发布者和订阅者解析不同的实例。

有没有办法让这种行为起作用?

最佳答案

这可能是一个错误。 我添加了new issueDryIoc GitHub repo . 请继续关注更新。

关于c# - 开放满足多接口(interface)的通用单例服务注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51741294/

相关文章:

c# - 这是自定义异常的好习惯吗?

c# - 将 FMOD 用于 C#?

c# - 如何使用 LINQ 和 C# 找到最接近 0,0 点的点

c# - 使用 DryIoc 解决多个注册之一

c# - 解析为 null 而不是异常

c# - DryIoc 范围和重用

C#、Visual Studio,如何获取错误和警告的 ID?

javascript - 在手机上点击 'Go' 时停止表单提交

.net - winform中的TreeView节点映射

c# - Compact Framework - 检索国家和地区列表