У меня есть этот класс:Autofac регистрации техника для этой конкретной проблемы
public class AutofacEventContainer : IEventContainer
{
private readonly IComponentContext _context;
public AutofacEventContainer(IComponentContext context)
{
_context = context;
}
public IEnumerable<IDomainEventHandler<T>> Handlers<T>(T domainEvent)
where T : IDomainEvent
{
return _context.Resolve<IEnumerable<IDomainEventHandler<T>>>();
}
}
IEventContainer
выглядеть следующим образом:
public interface IEventContainer
{
IEnumerable<IDomainEventHandler<T>> Handlers<T>(T domainEvent)
where T : IDomainEvent;
}
Сейчас этот IEventContainer
используется в классе DomainEvents
как это:
public static class DomainEvents
{
....................................
....................................
public static IEventContainer Container;
public static void Raise<T>(T domainEvent) where T : IDomainEvent
{
if (Container != null)
foreach (var handler in Container.Handlers(domainEvent))
handler.Handle(domainEvent);
// registered actions, typically used for unit tests.
if (_actions != null)
foreach (var action in _actions)
if (action is Action<T>)
((Action<T>)action)(domainEvent);
}
}
Моя цель состоит в том, чтобы зарегистрировать DomainEvents.Container
так, чтобы все обработчики были разрешены.
public class SomeModule : Module
{
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
//Wrong way in Autofac
//Because the following line is Ninject-like
DomainEvents.Container = new AutofacContainer(componentContext);
//What is the correct way to register it to achieve the above intent?
}
}
Что способ сделать это в Autofac?
В 'void Raise (TEvent @event), где T: IDomainEvent;' должен 'T' быть' TEvent'? –
Sartorial
@Sartorial yep, fixed –
'BeginLifetimeScope' появляется как неразрешенный символ ... мне не хватает ссылки? Я использую Autofac v3.0 – Sartorial