2012-02-21 48 views
2

行,所以我有一個基本類型:使用城堡溫莎創建一個對象,而不是一個工廠類

ProductBase 

,然後我有一些產品:

Product1: ProductBase 

Product2: ProductBase 

Product3: ProductBase 

然後,工廠類:

public class productFactory 
    { 
     public productBase GetProduct(Enums.product buildProduct) 
     { 

      var outProduct = new ProductBase(); 
      switch (buildProduct) 
      { 
       case Enums.Products.Product1: 
        outMis = new Product1(); 
        break; 

       case Enums.Products.Product2: 
        outMis = new Product2(); 
        break; 

       default: 
        outMis = new Product1(); 
        break; 

      } 

      return outProduct; 
     } 
    } 

我知道windsor可以做到這一點,我知道這是一件好事。

據我所見,productBase將需要成爲一個接口,產品實現它,但是我需要通過windsor中的enum開關來實現它們?

幫助和指針(鏈接)讚賞。這是在一個MVC.net 3項目中,我爲控制器和日誌記錄設置了windsor,所以我得到了一點 - 儘管在我對IoC和DI的理解方面存在巨大差距!

這樣做是這樣的,在地方的productFactory

要回答我的問題的一種方式 - 從這裏開始: http://codeblitz.wordpress.com/2009/05/06/using-factory-method-pattern-with-systemactivator/

,而不是使用productFactory:

public class productFactory 
{ 
    public static MisProduct CreateProduct(Enums.Product productType) 
    { 
     string assemblyName = Assembly.GetExecutingAssembly().GetName().Name; 
     //creates an instance based on the enum name 
     ProductBase myProduct = Activator.CreateInstance(
      null, 
      string.Format("{0}.Models.Products.{1}", assemblyName, productType) 
      ).Unwrap() as ProductBase; 
     if (myProduct == null) 
     { 
      //todo throw an Exception here. 
     } 
     return myProduct; 
    } 
} 

任何更多的建議嗎?

+0

要回答我的問題 - 從這裏開始: http://codeblitz.wordpress.com/2009/05/06/using-factory-method-pattern-with-systemactivator/ ,而不是使用productFactory: – nathfy 2012-02-21 13:14:43

回答

-1

如何使用這樣的事情:

public class ProductFactory 
{ 
    public T Create<T>() where T : ProductBase, new() 
    { 
     return new T(); 
    } 
} 

但我覺得你的問題無關,與dependenci注射。

編輯: 如果你需要使用的產品創造的城堡,那麼你可以使用這樣的事情:

public interface IProductFactory 
{ 
    T Create<T>() where T : ProductBase, new(); 
    void Destroy(ProductBase obj) 
} 

public class ProductFactory : IProductFactory 
{ 
    private readonly WindsorContainer _container; 

    public ProductFactory(WindsorContainer container) 
    { 
     _container = container; 
    } 

    public T Create<T>() where T : ProductBase, new() 
    { 
     return _container.Resolve<T>(); 
    } 

    public void Destroy(ProductBase obj) 
    { 
     _container.Release(obj); 
    } 
} 

您需要ProductFactory註冊IProductFactory,它應該工作。對不起,如果他們在代碼中有些錯誤,但我現在沒有Visual Studio來測試它。

+0

我是DI新手,所以你可以解釋一下,爲什麼我不會通過城堡windsor做到這一點?在我需要它的時候讓它創造對象不是更可取的嗎? – nathfy 2012-02-22 10:05:52

+0

從你的問題來看,這聽起來像你只解決工廠問題。我認爲我的解決方案是最簡單的。我假設你只想通過構造函數創建產品。爲此,您不需要使用Castle,因爲沒有相關性來注入您的Products對象。但是,如果您需要使用城堡創建對象,請參閱上面的編輯答案。 – 2012-02-22 16:08:24

+3

@eXist對不起,但有一個組件取決於容器本身肯定是一種反模式,沒有理由這樣做。根據我的回答,使用Typed工廠,您可以在不編寫任何代碼的情況下獲得相同的結果,並讓框架(Windsor)爲您完成相同的工作,但從組件角度透明。 – Crixo 2012-02-23 08:00:10

2

我建議你Typed Factory

您可以通過ID解決所需的具體類型或類型本身,這取決於你如何接收,有助於使混凝土選擇的參數。

根據您的示例,枚舉器可能與組件ID相關。

+0

我會嘗試這個並報告回來 - 謝謝 – nathfy 2012-02-23 09:33:32

+0

鏈接是(可能)。新鏈接https://github.com/castleproject/Windsor/blob/master/docs/typed-factory-facility-interface-based.md – Bakudan 2017-10-04 15:03:05