我正在研究如何在 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 issue至 DryIoc GitHub repo . 请继续关注更新。
关于c# - 开放满足多接口(interface)的通用单例服务注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51741294/