首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DryIOC事件聚合器

DryIOC事件聚合器
EN

Stack Overflow用户
提问于 2015-09-17 13:19:13
回答 1查看 348关注 0票数 3

我正在尝试使用DryIOC实现一个事件聚合器。我有一个事件调度员如下所示:

代码语言:javascript
复制
public class DryIocEventDispatcher : IEventDispatcher
{
    private readonly IContainer _container;

    public DryIocEventDispatcher(IContainer container)
    {
        _container = container;
    }

    public void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : EventArgs
    {
        foreach (var handler in _container.ResolveMany<IHandles<TEvent>>())
        {
            handler.Handle(eventToDispatch);
        }
    }
}

我有很多类可以处理事件。由以下接口指示:

代码语言:javascript
复制
public interface IHandles<T> where T : System.EventArgs
{
    void Handle(T args);
}

它的要点是,当我调用事件分派器分派方法,并传入继承自EventArgs的类型时。它从IOC容器中获取所有实现IHandles<>的类型,并对它们调用handle方法。

事件类型可以由多个服务处理。服务可以处理多个事件类型。例如:

代码语言:javascript
复制
public class ScoringService : IHandles<ZoneDestroyedEventArgs>, IHandles<ZoneCreatedEventArgs>
{
    public void Handle(ZoneDestroyedEventArgs args)
    {
        Console.WriteLine("Scoring Service Handled ZoneDestroyed Event");
    }

    public void Handle(ZoneCreatedEventArgs args)
    {
        Console.WriteLine("Scoring Service Handled ZoneCreated Event");
    }
}

public class RenderingService : IHandles<ZoneDestroyedEventArgs>, IHandles<ZoneCreatedEventArgs>
{
    public void Handle(ZoneDestroyedEventArgs args)
    {
        Console.WriteLine("Rendering Service Handled ZoneDestroyed Event");
    }

    public void Handle(ZoneCreatedEventArgs args)
    {
        Console.WriteLine("Rendering Service Handled ZoneCreated Event");
    }
}

服务不仅需要处理事件,还需要做其他事情(但可能没有其他接口,因为它们不是必需的)。一些服务需要是单例,事件的处理应该尊重单例注册。因此,对container.Resolve(IHandles<>)的调用应该返回该服务的Singleton类型,而不是创建多个实例。这些服务从多个源收集事件,因此需要在将它们发送到其他地方之前维护内部状态。因此,需要将调用不同服务的不同均衡器发送到同一个底层实例。

我希望能够将IHandles接口添加到任何服务中,并让它在不需要每次修改IOC映射的情况下自动获取。理想情况下,还应该使用基于约定的映射来添加服务类型。

到目前为止我已经做了两天了。我放弃了用结构图来实现它。现在我正在尝试DryIOC --但是发现它更难理解和正确。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-17 16:28:48

DryIoc中很容易做到(我是一个所有者)。在这里,我将谈到V2 RC版本。

考虑到您已经将IContainer依赖项替换为自动注入的IResolver

代码语言:javascript
复制
var container = new Container();

container.Register<IEventDispatcher, DryIocEventDispatcher>();
container.RegisterMany<ScoringService>(Reuse.Singleton);
container.RegisterMany<RenderingService>();

var eventDispatcher = container.Resolve<IEventDispatcher>();

eventDispatcher.Dispatch(new ZoneDestroyedEventArgs());
eventDispatcher.Dispatch(new ZoneCreatedEventArgs());

RegisterMany将处理作为Singleton重用的处理程序,并为两个Handles<>接口返回相同的实例。

此外,您还可以使用RegisterMapping向已经注册的实现添加/映射IHandles<>服务。

DryIoc甚至有更多来帮助EventAggregator实现。

这里还有类似于你的问题的解决方案。

用你的例子说明要点

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32631325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档