2010-11-22 6 views
1

Je ne suis pas sûr d'utiliser la bonne terminologie, mais j'ai plusieurs classes Controller qui renvoient des objets en utilisant différentes sources de données dans mon application Web ASP.NET. à savoirQuelle est la meilleure façon de charger/choisir les classes "controller"

Product p = ProductController.GetByID(string id); 

Ce que je veux être en mesure de faire est d'utiliser une usine de contrôleur qui peut choisir parmi différents ProductControllers. Je comprends le modèle d'usine de base, mais je me demandais s'il y avait un moyen de charger la classe de cotroller sélectionné en utilisant seulement une chaîne.

Ce que je veux réaliser est un moyen de renvoyer de nouveaux/différents contrôleurs sans avoir à mettre à jour une classe de fabrique. Quelqu'un a suggéré que je regarde injection de dépendance et MEF. J'ai regardé MEF mais j'ai eu du mal à comprendre comment implémenter ceci dans une application web.

J'aimerais obtenir quelques indications dans la bonne direction.

Répondre

1

Il y a plusieurs façons de résoudre ce problème. Vous n'avez pas besoin d'un framework pour effectuer l'injection de dépendance (bien que le codage à la main puisse vous amener à un point où les conteneurs IoC commencent à avoir du sens).

Puisque vous voulez appeler le GetByID sur plusieurs implémentations, je commencerais par extraire une interface du ProductController que vous avez.

public interface IProductController 
    { 
     Product GetByID(int id); 
    } 

    public class SomeProductController : IProductController 
    { 
     public Product GetByID(int id) 
     { 
      return << fetch code >> 
     } 
    } 

De là, vous pouvez résoudre la mise en œuvre dans un certain nombre de façons, quelques exemples:

public class ProductFetcher 
{ 
    // option 1: constructor injection 
    private readonly IProductController _productController; 

    public ProductFetcher(IProductController productController) 
    { 
     _productController = productController; 
    } 
    public Product FetchProductByID(int id) 
    { 
     return _productController.GetByID(id); 
    } 

    // option 2: inject it at the method level 
    public static Product FetchProductByID(IProductController productController, int id) 
    { 
     return productController.GetByID(id); 
    } 

    // option 3: black box the whole thing, this is more of a servicelocator pattern 
    public static Product FetchProductsByID(string controllerName, int id) 
    { 
     var productController = getProductController(controllerName); 
     return productController.GetByID(id); 
    } 

    private static IProductController getProductController(string controllerName) 
    { 
     // hard code them or use configuration data or reflection 
     // can also make this method non static and abstract to create an abstract factory 
     switch(controllerName.ToLower()) 
     { 
      case "someproductcontroller": 
       return new SomeProductController(); 
      case "anotherproductcontroller": 
       // etc 

      default: 
       throw new NotImplementedException(); 
     } 
    } 
} 

Il dépend toutes sortes de sur qui va être responsable de la sélection qui mise en œuvre ProductController doit être utilisé .

+0

L'injection de dépendances (inversion de commande) peut vraiment être utile dans cette situation. Il vous permet de modifier le comportement de votre ProductController à l'exécution, comme indiqué ci-dessus. – Jens

+0

Merci, j'ai envisagé d'utiliser une sorte de cadre DI. – Simon

Questions connexes