我正在尝试使用DryIOC实现一个事件聚合器。我有一个事件调度员如下所示:
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);
}
}
}我有很多类可以处理事件。由以下接口指示:
public interface IHandles<T> where T : System.EventArgs
{
void Handle(T args);
}它的要点是,当我调用事件分派器分派方法,并传入继承自EventArgs的类型时。它从IOC容器中获取所有实现IHandles<>的类型,并对它们调用handle方法。
事件类型可以由多个服务处理。服务可以处理多个事件类型。例如:
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 --但是发现它更难理解和正确。
发布于 2015-09-17 16:28:48
在DryIoc中很容易做到(我是一个所有者)。在这里,我将谈到V2 RC版本。
考虑到您已经将IContainer依赖项替换为自动注入的IResolver:
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实现。
这里还有类似于你的问题的解决方案。
https://stackoverflow.com/questions/32631325
复制相似问题