我刚刚修改了一个处理我的DDD命令的方法(之前它没有返回类型):
public static CommandResult<TReturn> Execute<TCommand, TReturn>(TCommand command)
where TCommand : IDomainCommand
{
var handler = IoCFactory.GetInstance<ICommandHandler<TCommand, TReturn>>();
return handler.Handle(command);
}
这个方法没问题,做了我想做的事情,但是使用它会产生一些不好的代码:
CommandResult<Customer> result =
DomainCommands.Execute<CustomerCreateCommand, Customer>
(
new CustomerCreateCommand(message)
);
在我添加Customer
返回类型TReturn
之前,它很好又整洁,并且该方法可以根据其用法推断出类型。然而,这已不再可能。
有没有办法使用任何新的C#功能,我可以重写上面的内容使其更整洁,即使用Func,Action,Expression等?我可能期待不可能的事情,但是我厌倦了编写这么多代码来调用一个过去非常简单的方法。
答案 0 :(得分:1)
稍微减少它的一个选项是为无法推断的类型参数设置静态泛型类型,允许您只使用一个类型参数的泛型方法可以推断:
public static class DomainCommands<TReturn>
{
public static CommandResult<TReturn> Execute<TCommand>(TCommand command)
where TCommand : IDomainCommand
{
var handler = IoCFactory.GetInstance<ICommandHandler<TCommand, TReturn>>();
return handler.Handle(command);
}
}
然后:
var result = DomainCommands<Customer>.Execute(new CustomerCreateCommand(msg));
它不是很多更好,但它稍微好一些。当然,如果域命令类型本身可能是通用的,那可能会有所帮助 - 因此CustomerCreateCommand
将实现IDomainCommand<Customer>
。如果您仍然需要非通用IDomainCommand,则可以从IDomainCommand<T>
派生IDomainCommand
。