我提了一個問題在這裏:Raising Domain Events For Multiple Subscribers和答案使我下面的模式,我可以有一個IEventPublisher像這樣:域事件模式單點排隊事件
public interface IEventPublisher<T>
{
void Publish(T data);
}
和IEventSubscriber像這樣:
public interface IEventSubscriber<T>
{
void Handle(T data);
}
這樣做的問題是,我需要在每個發佈者的實例傳遞給一個構造函數,像這樣:
public Service(IEventPublisher<ThingyChangedEvent> publisherThingyChanged)
{
// Set publisher to local variable
}
// then call this in a method
_publisherThingyChanged.Publish(new ThingyChangedEvent { ThingyId = model.Id});
我就非常希望能夠做的是有一個包含任何IEventPublishers一個通用的出版商,所以我可以調用的財產以後這樣的:
_genericPublisher.Publish(new ThingyChangedEvent { ThingyId = model.Id});
我無法弄清楚如何做雖然這是我可以」 t傳遞一個IEventPublisher的集合,而不像本例中那樣將T定義爲ThingyChangedEvent,而我想要的是根據傳遞給通用發佈者的類型來確定發佈者。
任何建議非常感謝。
編輯:
使用下面的答案,從這裏的一些信息OK:http://www.udidahan.com/2009/06/14/domain-events-salvation/我想出了下面的,但它也不能令人信服:
public interface IEventManager
{
void Publish<T>(T args) where T : IEvent;
}
公共類eventmanager進行:IEventManager { Autofac.ILifetimeScope _container;
public EventManager(Autofac.ILifetimeScope container)
{
_container = container;
}
//Registers a callback for the given domain event
public void Publish<T>(T args) where T : IEvent
{
var subscribersProvider = _container.Resolve<IEventSubscribersProvider<T>>();
foreach (var item in subscribersProvider.GetSubscribersForEvent())
{
item.Handle(args);
}
}
}
我現在可以採取IEventManager eventmanager進行的實例由autofac解決一個構造函數和調用它,如下所示:
_eventManager.Publish<ThingyChangedEvent>(new ThingyChangedEvent() { ThingyId = Guid.NewGuid() });
這裏是什麼,我不喜歡這個解決方案:
我不想在構造函數中使用ILifetimeScope的實例,我希望能夠獲取IEventSubscribersProvider的集合,但autofac不會reso射血,如果我問說:
IEnumerable<IEventSubscribersProvider<IEvent>>
我只能解決它,如果我通過類型來發布,並呼籲:
Resolve<IEventSubscribersProvider<T>>.
第二個問題是不是一個巨大的交易,但將是很好要能夠調用發佈,而不必通過類型以及像這樣:
_eventManager.Publish(new ThingyChangedEvent() { ThingyId = Guid.NewGuid() });
我想,如果任何人有,因爲我不喜歡把一個如何解決這兩個問題,特別是第1期的任何建議對Au的依賴tofac在不同的項目。我唯一能想出的是一種經理類,它明確地採取我需要的如下:
public SomeConstructor(
IEventSubscribersProvider<ThingyChangedEvent> thingChangedSubscribeProviders,
IEventSubscribersProvider<SomeOtherEvent> someOtherSubscribeProviders,
etc....)
{
// Maybe take the EventManager as well and add them to it somehow but would be
// far easier to take a collection of these objects somehow?
}
非常感謝您的任何建議。
EDIT 2
大量的研究後,看着這個Autofac Generic Service resolution at runtime我不知道我能做到我想做的。我能拿出最好的解決辦法是這樣的:
public interface IEventSubscribersProviderFactory : Amico.IDependency
{
IEventSubscribersProvider<T> Resolve<T>() where T : IEvent;
}
public class EventSubscribersProviderFactory : IEventSubscribersProviderFactory
{
Autofac.ILifetimeScope _container;
public EventSubscribersProviderFactory(Autofac.ILifetimeScope container)
{
_container = container;
}
public IEventSubscribersProvider<T> Resolve<T>() where T : IEvent
{
return _container.Resolve<IEventSubscribersProvider<T>>();
}
}
,然後讓eventmanager進行取IEventSubscribersProviderFactory在構造函數從該項目中移除對Autofac的依賴。
我現在就去,但希望能在長期內找到更好的解決方案。
您正在介紹「訂閱者提供者」和其他一些「經理」類(可怕的術語,我的寵物之一)的概念來管理訂閱者提供者*和*「事件管理器」以避免容器或使用autofac。這些聽起來就像NarrowingSubscriber,Multiplexor和我詳細介紹的調度程序 - 除了我詳細介紹的作品和你正在變得非常複雜。其他類中的容器是Service Locator,我認爲這是一種反模式(http://lynk.at/eE0hik),懷疑Udi會這樣做。 –