2012-02-21 53 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