2010-11-22 126 views
1

我不確定我是否使用了正確的術語,但我有幾個Controller類在ASP.NET Web應用程序中返回使用不同數據源的對象。即什麼是加載/選擇「控制器」類的最佳方式

Product p = ProductController.GetByID(string id); 

我想要做的就是使用一個控制器工廠,可以從不同的ProductController中選擇。我瞭解基本的工廠模式,但是想知道是否有一種方法只用一個字符串加載選定的cotroller類。

我想實現的是返回新的/不同的控制器而不必更新工廠類的方法。有人建議我看看依賴注入和MEF。我看了一下MEF,但我一直無法弄清楚如何在Web應用程序中實現這一點。

我很想得到正確方向上的一些指示。

回答

1

有很多方法可以解決這個問題。您不需要一個框架來執行依賴注入(儘管手動編寫它們可能會使您的IoC容器開始變得有意義)。

既然你想在多個實現上調用GetByID,我會先從你有的ProductController中提取一個接口。

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

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

從那裏,你可以解決多種方式,一些例子實施:

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

這一切都有點取決於誰去負責選擇哪些ProductController的實施需要使用。

+0

依賴注入(控制反轉)在這種情況下真的很有用。它允許您在運行時更改ProductController的行爲,如上所示。 – Jens 2010-11-22 12:48:40

+0

謝謝,我一直在尋找使用某種DI框架。 – Simon 2010-11-22 14:02:44

相關問題