DryIOC 事件聚合器
DryIOC Event Aggregator
我正在尝试使用 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<>) 的调用应该 return 该服务的 Singleton 类型,而不是创建多个实例。这些服务从多个来源收集事件,因此需要在将它们发送到其他地方之前维护内部状态。因此,调用不同服务的不同事件处理程序需要发送到相同的底层实例。
我希望能够将 IHandles 接口添加到任何服务,并让它自动获取,而不必每次都 fiddle 使用 IOC 映射。理想情况下,还应使用基于约定的映射来添加服务类型。
到目前为止,我已经为此工作了两天。我放弃了尝试用结构图来实现它。现在我正在尝试 DryIOC - 但发现它更难理解和正确。
在 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 的处理程序,并将 return 两个 Handles<>
接口的相同实例。
此外,您可以使用 RegisterMapping 到 add/map IHandles<>
服务来实现已注册的实现。
DryIoc 甚至 more 可以帮助实现 EventAggregator。
这里还有 problem similar to yours 的解决方案。
我正在尝试使用 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<>) 的调用应该 return 该服务的 Singleton 类型,而不是创建多个实例。这些服务从多个来源收集事件,因此需要在将它们发送到其他地方之前维护内部状态。因此,调用不同服务的不同事件处理程序需要发送到相同的底层实例。
我希望能够将 IHandles 接口添加到任何服务,并让它自动获取,而不必每次都 fiddle 使用 IOC 映射。理想情况下,还应使用基于约定的映射来添加服务类型。
到目前为止,我已经为此工作了两天。我放弃了尝试用结构图来实现它。现在我正在尝试 DryIOC - 但发现它更难理解和正确。
在 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 的处理程序,并将 return 两个 Handles<>
接口的相同实例。
此外,您可以使用 RegisterMapping 到 add/map IHandles<>
服务来实现已注册的实现。
DryIoc 甚至 more 可以帮助实现 EventAggregator。
这里还有 problem similar to yours 的解决方案。