2011-07-07 4 views
11

J'utilise le modèle de commande pour la première fois. Je ne sais pas très bien comment gérer les dépendances.Injection de dépendances lors de l'utilisation du modèle de commande

Dans le code ci-dessous, nous envoyons un CreateProductCommand qui est ensuite mis en file d'attente pour être exécuté ultérieurement. La commande encapsule toutes les informations à exécuter.

Dans ce cas, il est probable que nous devrons accéder à un certain type de magasin de données pour créer le produit. Ma question est, comment puis-je injecter cette dépendance dans la commande afin qu'elle puisse s'exécuter?

public interface ICommand { 
    void Execute(); 
} 

public class CreateProductCommand : ICommand { 
    private string productName; 

    public CreateProductCommand(string productName) { 
     this.ProductName = productName; 
    } 

    public void Execute() { 
     // save product 
    } 
} 

public class Dispatcher { 
    public void Dispatch<TCommand>(TCommand command) where TCommand : ICommand { 
     // save command to queue 
    } 
} 

public class CommandInvoker { 
    public void Run() { 

     // get queue 

     while (true) { 
      var command = queue.Dequeue<ICommand>(); 
      command.Execute(); 
      Thread.Sleep(10000); 
     } 
    } 
} 

public class Client { 
    public void CreateProduct(string productName) { 
     var command = new CreateProductCommand(productName); 
     var dispatcher = new Dispatcher(); 
     dispatcher.Dispatch(command); 
    } 
} 

Un grand merci
Ben

Répondre

13

Après avoir regardé votre code Je recommande de ne pas utiliser le modèle de commande, mais au lieu d'utiliser des objets de données de commande et un gestionnaire de commande:

public interface ICommand { } 

public interface ICommandHandler<TCommand> where TCommand : ICommand { 
    void Handle(TCommand command); 
} 

public class CreateProductCommand : ICommand { } 

public class CreateProductCommandHandler : ICommandHandler<CreateProductCommand> { 
    public void Handle(CreateProductCommand command) { 

    } 
} 

Ce scénario est plus approprié pour les cas où CreateProductCommand peut avoir besoin de franchir les limites de l'application. En outre, vous pouvez avoir une instance de CreateProductCommand résolue par un conteneur DI avec toutes les dépendances configurées. Le répartiteur, ou 'bus de message', appelle le gestionnaire lorsqu'il reçoit la commande.

Jetez un oeil here pour quelques informations d'arrière-plan.

+0

merci pour cela. Les gens du CQRS sur Twitter m'avaient aussi orienté dans cette direction. –

+0

Et même sans CQRS, un design comme indiqué ci-dessus a de grands avantages. Voici un [article informatif sur ce modèle] (http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91). – Steven

Questions connexes