2015-06-15 24 views
1

我使用統一登記所有我的域名事件處理喜歡這樣:統一解決通用的事件處理程序

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

使用檢查,TProductCreated類型,但Container.ResolveAll<IDomainEventHandler<T>>()不解決任何問題,即使通過檢查,我可以看到Container做註冊到此註冊類型IDomainEventHandler,映射類型爲ProductCreatedHandler

爲什麼容器沒有解析我在開始時註冊的泛型?

回答

2

ResolveAll只解決命名註冊,嘗試用一個名字註冊的處理程序,像這樣:

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

這可以在文檔中的備註中看到了ResolveAll<T>()

注意,這方法不會返回默認(未命名)註冊的實例。