使用Castle windsor创建对象而不是工厂类

时间:2012-02-21 10:57:12

标签: c# asp.net-mvc-3 c#-4.0 castle-windsor factory-pattern

好的,所以我有一个基本类型:

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

我知道温莎可以做到这一点,我知道这是件好事。

据我所知,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;
    }
}

还有人建议吗?

2 个答案:

答案 0 :(得分:2)

我建议你Typed Factory

您可以通过id或类型本身来解析所需的具体类型,这取决于您如何接收有助于做出具体选择的参数。

根据您的示例,枚举数可能与组件ID相关。

答案 1 :(得分:-1)

如何使用这样的东西:

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

但我认为你的问题与依赖注射无关。

修改 的 如果您需要使用castle来创建产品,那么您可以使用以下内容:

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来测试它。