2015-03-04 1 views
2
public interface IQueryHandler<in TQuery, out TResult> 
    where TQuery : IQuery<TResult> 
{ 
    TResult Handle(TQuery query); 
} 

Il s'agit d'une interface de gestionnaire de requêtes qui nécessite un paramètre pour exécuter la requête.Gestionnaire de requêtes CQRS sans paramètre

public class PlaceByIdHandler : IQueryHandler<PlaceById, PlaceModel> 
{ 
    ........... 

    public PlaceModel Execute(PlaceById query) 
    { 
     return repository.Query<PlaceModel>("select * from places where id="+ query.id); 
    } 
} 

Mais certaines requêtes n'ont pas besoin de paramètre. Par exemple Obtenir tous les lieux:

public class PlaceAllHandler : IQueryHandler<PlaceAll, PlaceModel> 
{ 
    .......... 

    public PlaceModel Execute(PlaceAll query) 
    { 
     return return repository.Query<PlaceModel>("select * from places"); 
    } 
} 

Mais maintenant PlaceAll est une classe qui n'a aucun membre.

public class PlaceAll{} 

Est-ce une véritable approche? Y a-t-il un ordre?

+0

'TResult' doit être en anse TResult Execute' dans l'interface – xanatos

+0

qui stuation sera être manipuler? Est-ce que Command? – barteloma

Répondre

0

IMHO c'est bien. Si le type de la classe est suffisant pour satisfaire le gestionnaire, ne lui ajoutez aucun paramètre, utilisez simplement la classe telle quelle. Quels paramètres ajouteriez-vous de toute façon?

Je ne suis pas sûr de ce que vous entendez par « Y at-il pour »

1

Mais certaines requêtes n'a pas besoin de paramètres.

Les paramètres/propriétés supplémentaires d'une requête sont facultatifs.

Votre requête PlaceAll (je l'appellerais AllPlaces) a toutes les informations. Si le gestionnaire de requêtes n'a pas besoin de paramètres supplémentaires pour la requête Handle, vous n'avez pas besoin de les spécifier.

Je pense que vous utilisez l'interface IQuiery<TResult> suivante:

public interface IQuery<TResult> 
{ } 

Comme vous pouvez le voir n'a pas de paramètres aussi bien. QueryHandler dépend uniquement du type de la requête (TQuery ou IQuery<TResult>).

1

Je suppose que vous pouvez déduire ma réponse des autres:

Vous avez deux options. Vous pouvez utiliser le modèle d'objet null. Ceci est similaire à votre classe PlaceAll mais devrait simplement être générique pour représenter toujours tous les résultats. Alors peut-être quelque chose comme AllResults suffirait. Maintenant, vous n'avez pas besoin de AllCities, AllSomething, etc.

L'autre façon est d'avoir un rôle d'interface plus explicite. Vous en avez déjà un qui prend un paramètre. Vous pouvez ajouter l'autre sans le paramètre comme Ilya a démontré:

public interface IQueryHandler<TQuery, TResult> {} 

public interface IQueryHandler<TResult> {} 

Cependant, vous devrez peut-être jeter/fonte en toute sécurité l'objet à utiliser.

Étant donné que la plupart des requêtes sont plutôt spécifiques à leur cas d'utilisation que j'ai mes doutes sur l'utilité de ces interfaces de recherche génériques, bien que :)