好的,所以我有一个基本类型:
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;
}
}
还有人建议吗?
答案 0 :(得分:2)
答案 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来测试它。