这是示例:

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/

    10-10 22:57