Unity解析通用事件处理程序

时间:2015-06-15 12:11:09

标签: c# generics unity-container dependency-resolver

我使用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

为什么容器没有解析我在开始时注册的泛型类型?

1 个答案:

答案 0 :(得分:2)

ResolveAll只解析命名注册,尝试使用名称注册您的处理程序,如下所示:

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

这可以在ResolveAll<T>()的文档中的备注中看到:

  

请注意,此方法不会返回默认(未命名)注册的实例。