2017-10-14 60 views
0

我有這個界面的多種實現:溫莎城堡:解決多個組件具有相同的名稱和類型

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); 
} 

然後我想註冊這個名稱屬性(按照約定)每個事件處理程序,然後我想要能夠解決所有具有相同的名稱(和相同類型的事件上下文)

組件,我希望我的目標是很清楚

所以我的問題是:

1)我如何做註冊部分(對我的界面名稱字段)?

2)兩個事件處理程序是否可以使用相同的名稱註冊?

3)工廠應該是什麼樣子?

又是我的目標是能夠說:我希望所有的事件處理程序處理型「AddingItemEventContext」的事件上下文,但只有那些有名字「ElectronicItem」(然後我得到的所有的處理程序與我有關)

+1

這聽起來很適合[策略模式](https://sourcemaking.com/design_patterns/strategy)。有關爲單個事件選擇多個服務的實現,請參見[依賴注入類型選擇](https://stackoverflow.com/a/34331154)。 – NightOwl888

回答

1

是否有可能讓兩個事件處理程序使用相同的名稱註冊?

不需要。因此使用容器解析不適用於這種設計。

您可以在您的工廠中執行的操作是解決所有匹配所需類型的處理程序,然後過濾掉與提供的名稱不匹配的處理程序。