2010-11-15 17 views
0

Je viens modifié une méthode pour gérer mes commandes de DDD (il avait auparavant aucun type de retour):Est-il possible de nettoyer la méthode générique suivante en utilisant l'une des nouvelles fonctionnalités 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); 
} 

La méthode est très bien, et fait ce que je veux faire, mais l'utiliser crée des fugly Code:

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

Avant ajouté le type Customer de retour TReturn, il était agréable et bien rangé et la méthode pourrait déduire les types de son utilisation. Cependant, ce n'est plus possible.

Y at-il moyen d'utiliser de nouvelles fonctionnalités C# que je pourrais réécrire ci-dessus pour le rendre plus net, c'est-à-dire en utilisant Func, Action, Expression, etc? Je m'attends probablement à l'impossible, mais je commence à en avoir marre d'écrire autant de code pour appeler une seule méthode qui était très simple.

Répondre

1

Une option pour réduire légèrement est d'avoir un type générique statique pour le paramètre de type ne peut pas être inférée, vous permettant d'avoir une méthode générique avec un seul paramètre de type qui peut être inférée:

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); 
    } 
} 

Puis:

var result = DomainCommands<Customer>.Execute(new CustomerCreateCommand(msg)); 

ce n'est pas beaucoup plus agréable, mais il est un peu mieux. Bien sûr, si le type de commande de domaine lui-même pouvait être générique, cela pourrait aider - ainsi, CustomerCreateCommand implémenterait IDomainCommand<Customer> par exemple. Si vous avez toujours besoin d'une IDomainCommand non générique, vous pouvez faire IDomainCommand<T> dériver de IDomainCommand.