2010-11-15 2 views
0

Я только изменил способ обработки моих команд DDD (ранее не имело возвращаемый типа):Есть ли способ очистить следующий общий метод, используя любые новые функции C# 4?

public static CommandResult<TReturn> Execute<TCommand, TReturn>(TCommand command) 
    where TCommand : IDomainCommand 
{ 
    var handler = IoCFactory.GetInstance<ICommandHandler<TCommand, TReturn>>(); 
    return handler.Handle(command); 
} 

Метод хорошо, и делает то, что я хочу, чтобы это сделать, однако его использование создает некоторый Fugly код:

CommandResult<Customer> result = 
    DomainCommands.Execute<CustomerCreateCommand, Customer> 
    (
     new CustomerCreateCommand(message) 
    ); 

Прежде чем я добавил типа Customer возвращения TReturn, это было красиво и аккуратно, и метод может вывести типы из его использования. Однако это уже невозможно.

Есть ли какой-либо способ использования каких-либо новых функций C#, которые я мог бы переписать выше, чтобы сделать его более аккуратным, то есть с помощью Func, Action, Expression и т. Д.? Я, вероятно, ожидаю невозможного, но мне надоело писать столько кода, чтобы просто вызвать один метод, который был очень простым.

ответ

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<T> от IDomainCommand.

 Смежные вопросы

  • Нет связанных вопросов^_^