C# 温莎城堡有多个构造器

C# 温莎城堡有多个构造器,c#,dependency-injection,castle-windsor,constructor,C#,Dependency Injection,Castle Windsor,Constructor,我目前正在进行一项转换,从Ninject的使用到Castle Windsor的当前版本,用于一个简单的C#.NET应用程序 在大多数情况下,转换进行得很顺利,容器的实现执行得很完美。但是,我的存储库对象有一个小问题 我有一个按以下方式编码的用户存储库对象: public class UserRepository : IUserRepository { public UserRepository(IObjectContext objectContext) { // Che

我目前正在进行一项转换,从Ninject的使用到Castle Windsor的当前版本,用于一个简单的C#.NET应用程序

在大多数情况下,转换进行得很顺利,容器的实现执行得很完美。但是,我的存储库对象有一个小问题

我有一个按以下方式编码的用户存储库对象:

public class UserRepository : IUserRepository {
    public UserRepository(IObjectContext objectContext)  {
        // Check that the supplied arguments are valid.
        Validate.Arguments.IsNotNull(objectContext, "objectContext");

        // Initialize the local fields.
        ObjectContext = objectContext;
    }

    public UserRepository(IObjectContextFactory factory) 
        : this(factory.CreateObjectContext()) { 
    }

    // -----------------------------------------------
    // Insert methods and properties...
    // -----------------------------------------------
}
为了与此代码相对应,我在应用程序的配置文件中设置了以下条目:

<castle>
    <components>
        <component id="objectContextFactory" lifestyle="custom"
                   customLifestyleType="Common.Infrastructure.PerWebRequestLifestyleManager, Common.Castle"
                   service="Project.DAL.Context.IObjectContextFactory, Project.DAL.LINQ"
                   type="project.DAL.Context.ObjectContextFactory, Project.DAL.LINQ">
        </component>
        <component id="userRepository" lifestyle="custom"
                   customLifestyleType="Common.Infrastructure.PerWebRequestLifestyleManager, Common.Castle"
                   service="Project.BL.Repository.IUserRepository, Project.BL"
                   type="Project.BL.Repository.UserRepository, Project.BL.LINQ">
            <parameters>
              <factory>${objectContextFactory}</factory>
            </parameters>
        </component>
    </components>
</castle>

${objectContextFactory}
对我来说,一切看起来都应该如此。当我尝试解析IObjectContextFactory服务的实例时,我检索一个ObjectContextFactory对象。当我尝试解决IUserRepository服务的实例时,我的问题就出现了。我有以下令人愉快的例外:

无法创建组件“userRepository”,因为它具有要满足的依赖项。 userRepository正在等待以下依赖项:

服务:

-SandCastle.DAL.Context.IObjectContext未注册。


我已经尝试了我能想到的一切。所以,对于stackoverflow的读者们,我想说:有什么想法吗?

这可能被认为是一个bug(事实上,对于这样的情况,它是可以修复的),但这是一种设计特性


温莎试图匹配它能满足的最贪婪的构造函数(参数最多的构造函数)

然而,在您的例子中,有两个构造函数的参数数量最多(一个),因此Windsor只选择第一个,其中“第一个”的含义未定义

事实上,如果您在源代码中切换构造函数的顺序,您的代码将开始工作,尽管这是一种黑客行为,依赖于未记录的行为而不这样做

让我们回到起点,好吗

我说温莎很困惑,因为它无法满足最贪婪的构造函数

快速且定义良好的修复方法是向其中一个构造函数添加一个伪参数,以便它们具有不同数量的参数:

public class UserRepository : IUserRepository {
    public UserRepository(IObjectContext objectContext, object fakeIgnoreMe)  {
        // Check that the supplied arguments are valid.
        Validate.Arguments.IsNotNull(objectContext, "objectContext");
        // ignoring fake additional argument
        // Initialize the local fields.
        ObjectContext = objectContext;
    }

    public UserRepository(IObjectContextFactory factory) 
        : this(factory.CreateObjectContext()) { 
    }

    // -----------------------------------------------
    // Insert methods and properties...
    // -----------------------------------------------
}
请向或报告此问题,以便修复。

从Windsor 3.2.x开始 如果将属性
Castle.Core.DoNotSelectAttribute
应用于构造函数,则不会选择该属性,尽管有任何其他条件

public class UserRepository : IUserRepository
{
    [DoNotSelect] // This constructor will be ignored by Windsor
    public UserRepository(IObjectContext objectContext)
    {
        // ...
    }

    public UserRepository(IObjectContextFactory factory)
        : this(factory.CreateObjectContext()) {}
}

参考资料:

工作起来就像是帮派杀手!谢谢“温莎试图匹配最贪婪的构造函数(它能满足的参数最多的构造函数)”。我认为更正确的说法是“从只包含可解析参数的构造函数列表中,选择了参数最多的构造函数”。@KrzysztofKoźmic:我认为“(“and”)”的adition是:-)@KrzysztofKoźmic:我想与您讨论一下这种构造函数解析行为。有没有一个渠道可以让我们就此事进行沟通(比如邮件)?Castle用户谷歌集团如何?那通常是最好的地方