【问题标题】:Castle Windsor: Resolve multiple components with the same name and typeCastle Windsor:解析多个同名同类型的组件
【发布时间】:2017-10-14 19:21:30
【问题描述】:

我有这个接口的多个实现:

 public interface IDomainEventHandler<TDomainEventContext> 
    where TDomainEventContext : IDomainEventContext
{
    void Handle(TDomainEventContext context, object sender); 
}

我想根据事件上下文的类型在运行时解决其中的一些问题,所以我在我的系统中添加了类型化工厂:

ublic interface IDomainEventHandlerFactory : IDisposable
{
   IEnumerable<IDomainEventHandler<TDomainEventContext>> ResolveAll<TDomainEventContext>() 
        where TDomainEventContext : IDomainEventContext;
}

这是我的注册:

container.Register(Classes.FromAssemblyContaining<SomeClass>().
         BasedOn(typeof(IDomainEventHandler<>)).WithServiceAllInterfaces().
         LifestyleTransient());

现在我想做下一件事:

将 Name 属性添加到 IDomainEventHandler 接口:

public interface IDomainEventHandler<TDomainEventContext> 
    where TDomainEventContext : IDomainEventContext
{
    string Name { get; }

    void Handle(TDomainEventContext context, object sender); 
}

然后我想用这个 Name 属性注册每个事件处理程序(按照约定),然后我希望能够解析所有具有相同名称(和相同类型的事件上下文)的组件

我希望我的目标足够明确

所以我的问题是:

1) 我是如何进行注册部分的(针对我界面中的名称字段)?

2) 两个事件处理程序是否可以使用相同的名称注册?

3) 工厂应该是什么样子?

再次,我的目标是能够说:我希望所有事件处理程序处理类型为“AddingItemEventContext”的事件上下文,但只有名称为“ElectronicItem”的事件处理程序(然后我得到所有与我相关的处理程序)

【问题讨论】:

标签: c# dependency-injection castle-windsor


【解决方案1】:

两个事件处理程序是否可以使用相同的名称注册?

没有。因此,使用容器解析不适用于此设计。

你可以在你的工厂做的是解析所有匹配所需类型的处理程序,然后过滤掉那些与提供的名称不匹配的处理程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2016-02-26
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多