为structuremap定义自定义转换以自动注册命令,CommandHandlers

时间:2014-05-26 10:32:16

标签: c# registry structuremap cqrs

我在最近的项目中使用CQRS模式,所以我定义了一些我称之为CommandsCommandParameter的{​​{1}}。

对于CommandHandlers我有CommandParameters个es和Class s:

Interface

对于public interface ICommandParameter { } public abstract class BaseEntityCommandParameter<T> : IAggregateRoot,ICommandParameter where T : ModelEntitySuperType, new() { public T Entity { get; set; } protected BaseEntityCommandParameter() { Entity = new T(); } } public class InsertCommandParameter<T> : BaseEntityCommandParameter<T> where T : class, new() { } 我定义了这些CommandHandlers es和Class s:

Interface

我使用它们为每个public interface ICommandHandler<TCommandParameter> where TCommandParameter :ICommandParameter { void Handle(TCommandParameter parameter); string CommandCode { get; } } public class InsertCommandHandler<TCommandParameter, TEntity> : ICommandHandler<TCommandParameter> where TCommandParameter : BaseEntityCommandParameter<TEntity>, new() where TEntity : ModelEntitySuperType, IAggregateRoot, new() 制作适当的CommandParameterCommandHandler,例如我Entity

Order

我想自动使用public class OrderInsertCommandParameter:InsertCommandParameter<Order> { } public class OrderInsertCommandHandler : InsertCommandHandler<OrderInsertCommandParameter, Order> { private readonly IUnitOfWorkFactory _factory; public OrderInsertCommandHandler(IUnitOfWorkFactory factory, IRepository<Order> repository) : base(repository) { _factory = factory; } public override void Handle(OrderInsertCommandParameter parameter) { var uow = _factory.Create(); parameter.Entity.OrderCreationTime = DateTime.Now; base.Handle(parameter); uow.Commit(); } } 注册这些CommandParameter和相应的CommandHandler,如何定义自定义转换来执行此操作?

1 个答案:

答案 0 :(得分:0)

以下应该可以解决问题:

container.Configure(r => 
{ 
    r.Scan(s => 
    { 
        s.Assembly(typeof(ICommandHandler<>).Assembly);
        s.ConnectImplementationsToTypesClosing(typeof(ICommandHandler<>)); 
    }); 
});