2012-07-13 52 views
0

我玩类型工厂实现,我一直在阅读关于类型工厂的城堡页面。我想知道如何将构造参数传递到泛型工厂。MVC DI城堡类型工厂设施与参数

public interface IFacilityFactory { 
    IFacility<T> Create<T>(); // how to pass some parameter(s) to any T constructor? 
} 

您能否给我一些指导?非常感谢你。

+1

你为什么要这样做? – 2012-07-13 21:59:02

+0

谢谢。我想要做这样的事情var component = factory.CreateComponent(“foo”,3);在打字的工厂页面上找到它。对不起,我是盲人。 – Tom 2012-07-14 04:00:26

回答

2

它没有多大意义,因为您需要为可用作泛型类型参数'T'的无限可能类型集提供一组公共的构造函数参数。

然而,把意识放在一边,我相信你可以做到这一点。您只需在工厂界面上声明参数,即使用Resolve()Windsor将在工厂使用时执行的参数。参数名称将成为字典键。您不需要声明将从容器本身解析的构造函数属性。

E.g.说我们必须在容器和相关的类Foo注册的成分吧:

public class Foo 
{ 
    // Constructor requires Bar to be resolved from the container 
    public Foo(int something, Bar bar, string somethingElse) 
    { 
     ... 
    } 
} 

我们将宣布工厂接口:

public interface IGenericFactory 
{ 
    T Create<T>(int something, string somethingElse) 
} 

当我们使用类型化的工厂,温莎将通过两个参数解决容器中的其他参数(bar)。 '东西'和'东西埃尔斯'参数只是被推送到一个词典和温莎数字,如果它可以使用它们或不。当然,如果您致电Create<Foo>(1, ""),它们将能够使用它们,但对于除Foo以外的任何类型,它们可能都是多余的。

+0

谢谢。我必须失明。它在它们的类型化工厂指令页面上:IComponent CreateComponent(string componentName,int someParameter); var component = factory.CreateComponent(“foo”,3); 直接等价于调用: var component = kernel.Resolve (new Dictionary {{“componentName”,“foo”},{“someParameter”,3}}); – Tom 2012-07-14 03:57:14