统一解析通用事件处理程序
Unity resolving generic event handlers
我正在使用 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
为什么容器没有解析我在开始时注册的通用类型?
ResolveAll
仅解析命名注册,尝试使用名称注册您的处理程序,如下所示:
container.RegisterType<IDomainEventHandler<ProductCreated>, ProductCreatedHandler>("ProductCreatedHandler", new PerRequestLifetimeManager());
这可以在 ResolveAll<T>()
的文档中的备注下看到:
Be aware that this method does NOT return an instance for the default (unnamed) registration.
我正在使用 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
为什么容器没有解析我在开始时注册的通用类型?
ResolveAll
仅解析命名注册,尝试使用名称注册您的处理程序,如下所示:
container.RegisterType<IDomainEventHandler<ProductCreated>, ProductCreatedHandler>("ProductCreatedHandler", new PerRequestLifetimeManager());
这可以在 ResolveAll<T>()
的文档中的备注下看到:
Be aware that this method does NOT return an instance for the default (unnamed) registration.