2015-06-15 5 views
1

Я использую Unity, чтобы зарегистрировать все свои обработчик событий домена, как, например:Unity решения родовых обработчики событий

public static void RegisterTypes(IUnityContainer container) 
{ 
    container.RegisterType<IDomainEventHandler<ProductCreated>, ProductCreatedHandler>(new PerRequestLifetimeManager()); 
} 

Моего обработчик выглядит следующим образом:

public class ProductCreatedHandler : IDomainEventHandler<ProductCreated> 
{ 
    public void Handle(ProductCreated domainEvent) 
    { 
     // Handle the event 
    } 
} 

Мое событие домен выглядит следующим образом:

public class ProductCreated : IDomainEvent 
{ 
    private Product product; 

    public ProductCreated(Product product) 
    { 
     this.product = product; 
    } 
} 

И я поднимаю это событие с помощью:

var product = new Product() 
{ 
    ProductGuid = Guid.NewGuid().ToString(), 
    ProductCode = productCode, 
    ProductName = productName, 
}; 

DomainEvents.Raise<ProductCreated>(new ProductCreated(product)); 

И обрабатывать поднятые события со следующим кодом:

public static void Raise<T>(T args) where T : IDomainEvent 
{ 
    if (Container != null) 
    { 
     foreach (var handler in Container.ResolveAll<IDomainEventHandler<T>>()) 
     { 
      handler.Handle(args); 
     } 
    } 
} 

Использование инспектора, T является ProductCreated типа, но Container.ResolveAll<IDomainEventHandler<T>>() ничего не решает, даже если через инспектор я могу видеть, что Container делает имеют регистрацию зарегистрированного типа IDomainEventHandler с отображаемым типом ProductCreatedHandler

Почему контейнер не разрешает общий тип, который я регистрирую в начале?

ответ

2

ResolveAll только решает названные регистраций, попробуйте зарегистрироваться обработчик с именем, например, так:

container.RegisterType<IDomainEventHandler<ProductCreated>, ProductCreatedHandler>("ProductCreatedHandler", new PerRequestLifetimeManager()); 

Это можно увидеть в разделе Примечания в документации ResolveAll<T>():

Имейте в виду, что это метод НЕ возвращает экземпляр для регистрации по умолчанию (без имени).