1 /// <summary> 2 /// 3 /// </summary> 4 public interface ICommand 5 { 6 }
1 /// <summary> 2 /// 3 /// </summary> 4 public interface ICommandResult 5 { 6 bool Success { get; } 7 int? ReturnKey { get; } 8 9 string ReturnKeys { get; } 10 11 }
1 /// <summary> 2 /// 3 /// </summary> 4 /// <typeparam name="TCommand"></typeparam> 5 public interface ICommandHandler<in TCommand> where TCommand : ICommand 6 { 7 ICommandResult Execute(TCommand command); 8 }
1 /// <summary> 2 /// 3 /// </summary> 4 /// <typeparam name="TCommand"></typeparam> 5 public interface IValidationHandler<in TCommand> where TCommand : ICommand 6 { 7 IEnumerable<ValidationResult> Validate(TCommand command); 8 }
1 /// <summary> 2 /// 3 /// </summary> 4 public class CommandResult : ICommandResult 5 { 6 public CommandResult(bool success, int? returnkey = null, string returnKeys = null) 7 { 8 this.Success = success; 9 this.ReturnKey = returnkey; 10 this.ReturnKeys = returnKeys; 11 } 12 13 public bool Success { get; protected set; } 14 15 public int? ReturnKey { get; protected set; } 16 17 public string ReturnKeys { get; protected set; } 18 19 }
1 /// <summary> 2 /// 3 /// </summary> 4 public class CommandHandlerNotFoundException : Exception 5 { 6 public CommandHandlerNotFoundException(Type type) 7 : base(string.Format("Command handler not found for command type: {0}", type)) 8 { 9 } 10 }
1 /// <summary> 2 /// 3 /// </summary> 4 public class ValidationHandlerNotFoundException : Exception 5 { 6 public ValidationHandlerNotFoundException(Type type) 7 : base(string.Format("Validation handler not found for command type: {0}", type)) 8 { 9 } 10 }
1 /// <summary> 2 /// 3 /// </summary> 4 public interface ICommandBus 5 { 6 ICommandResult Submit<TCommand>(TCommand command) where TCommand : ICommand; 7 IEnumerable<ValidationResult> Validate<TCommand>(TCommand command) where TCommand : ICommand; 8 }
1 /// <summary> 2 /// 3 /// </summary> 4 public class DefaultCommandBus : ICommandBus 5 { 6 public ICommandResult Submit<TCommand>(TCommand command) where TCommand : ICommand 7 { 8 var handler = (ICommandHandler<TCommand>)DependencyDefaultInstanceResolver.GetInstance(typeof(ICommandHandler<TCommand>)); 9 if (!((handler != null) && handler is ICommandHandler<TCommand>)) 10 { 11 throw new CommandHandlerNotFoundException(typeof(TCommand)); 12 } 13 return handler.Execute(command); 14 } 15 16 public IEnumerable<ValidationResult> Validate<TCommand>(TCommand command) where TCommand : ICommand 17 { 18 var handler = (IValidationHandler<TCommand>)DependencyDefaultInstanceResolver.GetInstance(typeof(IValidationHandler<TCommand>)); 19 if (!((handler != null) && handler is IValidationHandler<TCommand>)) 20 { 21 throw new ValidationHandlerNotFoundException(typeof(TCommand)); 22 } 23 return handler.Validate(command); 24 } 25 26 }
1 /// <summary> 2 /// Describes the result of a validation of a potential change through a business service. 3 /// </summary> 4 public class ValidationResult 5 { 6 7 /// <summary> 8 /// Initializes a new instance of the <see cref="ValidationResult"/> class. 9 /// </summary> 10 public ValidationResult() 11 { 12 } 13 14 /// <summary> 15 /// Initializes a new instance of the <see cref="ValidationResult"/> class. 16 /// </summary> 17 /// <param name="memeberName">Name of the memeber.</param> 18 /// <param name="message">The message.</param> 19 public ValidationResult(string memeberName, string message) 20 { 21 this.MemberName = memeberName; 22 this.Message = message; 23 } 24 25 /// <summary> 26 /// Initializes a new instance of the <see cref="ValidationResult"/> class. 27 /// </summary> 28 /// <param name="message">The message.</param> 29 public ValidationResult(string message) 30 { 31 this.Message = message; 32 } 33 34 /// <summary> 35 /// Gets or sets the name of the member. 36 /// </summary> 37 /// <value> 38 /// The name of the member. May be null for general validation issues. 39 /// </value> 40 public string MemberName { get; set; } 41 42 /// <summary> 43 /// Gets or sets the message. 44 /// </summary> 45 /// <value> 46 /// The message. 47 /// </value> 48 public string Message { get; set; } 49 50 }
注冊
1 builder.RegisterType<DefaultCommandBus>().As<ICommandBus>().InstancePerLifetimeScope(); 2 3 var domainCommands = Assembly.Load("Frozen.DomainCommands"); 4 builder.RegisterAssemblyTypes(domainCommands) 5 .AsClosedTypesOf(typeof(ICommandHandler<>)).InstancePerLifetimeScope(); 6 builder.RegisterAssemblyTypes(domainCommands) 7 .AsClosedTypesOf(typeof(IValidationHandler<>)).InstancePerLifetimeScope();
定義Command
1 /// <summary> 2 /// Command 刪除學生 3 /// </summary> 4 public class DeleteStudentCommand : ICommand 5 { 6 /// <summary> 7 /// 學生Id 8 /// </summary> 9 public int StuId { get; set; } 10 11 }
定義Handler
1 /// <summary> 2 /// 3 /// </summary> 4 public class DeleteStudentHandler : ICommandHandler<DeleteStudentCommand> 5 { 6 private readonly IStuEducationRepo _iStuEducationRepo; 7 8 public DeleteStudentHandler(IStuEducationRepo iStuEducationRepo) 9 { 10 this._iStuEducationRepo = iStuEducationRepo; 11 } 12 13 public ICommandResult Execute(DeleteStudentCommand command) 14 { 15 16 17 return new CommandResult(true); 18 } 19 20 }
調用
1 var command = new DeleteStudentCommand() 2 { 3 StuId = 1 4 }; 5 var result = _commandBus.Submit(command);
結果:
已打包成附件
http://files.cnblogs.com/files/frozenzhang/Frozen.DomainCommands.zip