Есть ли способ очистить следующий универсальный метод с помощью каких-либо новых функций C # 4? - PullRequest
0 голосов
/ 15 ноября 2010

Я только что изменил метод для обработки моих команд 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 и т. Д.?Я, вероятно, ожидаю невозможного, но мне надоело писать так много кода, чтобы просто вызывать один метод, который раньше был очень простым.

1 Ответ

1 голос
/ 15 ноября 2010

Один вариант немного уменьшить его - это иметь статический универсальный тип для параметра типа, который не может выводить, что позволяет вам иметь универсальный метод только с одним параметром типа, который может Выводится:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...