有很多方法可以解決這個問題。您不需要一個框架來執行依賴注入(儘管手動編寫它們可能會使您的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的實施需要使用。
依賴注入(控制反轉)在這種情況下真的很有用。它允許您在運行時更改ProductController的行爲,如上所示。 – Jens 2010-11-22 12:48:40
謝謝,我一直在尋找使用某種DI框架。 – Simon 2010-11-22 14:02:44