Код: Выделить всё
public interface IEventPublisher
{
void Publish(T data);
}
Код: Выделить всё
public interface IEventSubscriber
{
void Handle(T data);
}
Код: Выделить всё
public Service(IEventPublisher publisherThingyChanged)
{
// Set publisher to local variable
}
// then call this in a method
_publisherThingyChanged.Publish(new ThingyChangedEvent { ThingyId = model.Id});
Код: Выделить всё
_genericPublisher.Publish(new ThingyChangedEvent { ThingyId = model.Id});
Любые предложения очень приветствуются.
РЕДАКТИРОВАТЬ:
ОК, используя ответ ниже и некоторую информацию отсюда: http://www.udidahan.com/2009/06/14/doma ... salvation/ Я придумал следующее, но это не совсем так:
Код: Выделить всё
public interface IEventManager
{
void Publish(T args) where T : IEvent;
}
{
Autofac.ILLifetimeScope _container;
Код: Выделить всё
public EventManager(Autofac.ILifetimeScope container)
{
_container = container;
}
//Registers a callback for the given domain event
public void Publish(T args) where T : IEvent
{
var subscribersProvider = _container.Resolve();
foreach (var item in subscribersProvider.GetSubscribersForEvent())
{
item.Handle(args);
}
}
Теперь я могу взять экземпляр IEventManager eventManager в конструкторе, разрешенном autofac, и вызвать его следующим образом:
Код: Выделить всё
_eventManager.Publish(new ThingyChangedEvent() { ThingyId = Guid.NewGuid() });
Я не хочу использовать экземпляр ILifetimeScope в конструкторе, я хочу иметь возможность брать коллекцию IEventSubscribersProvider, но autofac не решит эту проблему, если я попрошу сказать:
Код: Выделить всё
IEnumerable
Код: Выделить всё
Resolve.
Код: Выделить всё
_eventManager.Publish(new ThingyChangedEvent() { ThingyId = Guid.NewGuid() });
Код: Выделить всё
public SomeConstructor(
IEventSubscribersProvider thingChangedSubscribeProviders,
IEventSubscribersProvider 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?
}
РЕДАКТИРОВАНИЕ 2
После долгих исследований и просмотра этого решения Autofac Generic Service во время выполнения я не уверен, что смогу достичь того, чего хочу. Лучшее решение, которое я могу придумать, это:
Код: Выделить всё
public interface IEventSubscribersProviderFactory : Amico.IDependency
{
IEventSubscribersProvider Resolve() where T : IEvent;
}
public class EventSubscribersProviderFactory : IEventSubscribersProviderFactory
{
Autofac.ILifetimeScope _container;
public EventSubscribersProviderFactory(Autofac.ILifetimeScope container)
{
_container = container;
}
public IEventSubscribersProvider Resolve() where T : IEvent
{
return _container.Resolve();
}
}
Я пока воспользуюсь этим, но надеюсь, что найду лучшее решение в долгосрочной перспективе.>
Подробнее здесь: https://stackoverflow.com/questions/156 ... eue-events
Мобильная версия