C# 温莎城堡有多个构造器
我目前正在进行一项转换,从Ninject的使用到Castle Windsor的当前版本,用于一个简单的C#.NET应用程序 在大多数情况下,转换进行得很顺利,容器的实现执行得很完美。但是,我的存储库对象有一个小问题 我有一个按以下方式编码的用户存储库对象: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
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用户谷歌集团如何?那通常是最好的地方