这是示例:
interface IComponentA {};
class ComponentA : IComponentA { };
interface IComponentB { };
class ComponentB : IComponentB { };
interface IComponentC { };
class ComponentC : IComponentC
{
public ComponentC(IComponentA a)
{
Console.WriteLine("Constructor A");
}
public ComponentC(IComponentB b)
{
Console.WriteLine("Constructor B");
}
};
所有这些组件都在CaSTLe Windsor容器中注册。
但是
ComponentC
类有2个重载的构造函数。激活ComponentC
时可以使用其中任何一个。我需要使用
ComponentC(IComponentB b)
构造函数。一会儿我正在使用UsingFactoryMethod()方法来解决这个问题:
container
.Register(Component
.For<IComponentA>()
.ImplementedBy<ComponentA>())
.Register(Component
.For<IComponentB>()
.ImplementedBy<ComponentB>())
.Register(Component
.For<IComponentC>()
.UsingFactoryMethod(() => new ComponentC(
container.Resolve<IComponentB>())));
它可以工作,但是温莎城堡可能提供了一些更好的方法呢?
任何帮助都非常感谢。
谢谢。
最佳答案
温莎不提供这种情况的支持,因为它打破了它(和大多数容器)基于以下条件进行操作的一个不成文的假设:“所有构造函数均被创建为相等”。
这意味着,无论选择哪个构造函数,组件的行为都不应存在功能上的差异。在所有条件相同的情况下,组件拥有的功能越多,它具有的功能就越多,这就是Windsor倾向于优先选择贪婪的构造函数的原因,但是在像您这样的情况下,我会说发生了两种情况之一:
我看到的另一种情况是这样的:
public class Foo
{
public Foo(ISession session){/*code*/}
public Foo(ISessionFactory factory):this(factory.OpenSession()){}
}
虽然这乍看起来似乎是一个聪明的主意,但充其量不过是多余的,令人困惑的和不必要的。如果您的情况看起来像这样,我将删除第二个构造函数。
关于c# - 温莎城堡: Force resolver to use specified constructor,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7926686/