gpt4 book ai didi

c# - 具有多个构造函数的 CaSTLe Windsor

转载 作者:太空狗 更新时间:2023-10-29 21:31:27 27 4
gpt4 key购买 nike

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

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

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

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>

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

Can't create component 'userRepository' as it has dependencies to be satisfied. userRepository is waiting for the following dependencies:

Services:

- SandCastle.DAL.Context.IObjectContext which was not registered.

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

最佳答案

这可能被认为是一个错误(实际上对于这样的情况它是可以修复的)但它是一种设计使然的功能。

Windsor 尝试匹配它可以满足的最贪婪的构造函数(具有最多参数的构造函数)。

但是在您的情况下,有两个构造函数具有最多的参数(一个),因此 Windsor 只选择第一个,其中“第一个”的含义是未定义的。

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

让我们回到开始的地方好吗?

我说 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...
// -----------------------------------------------
}

请将此问题报告给 Castle users liststraight to issue tracker这样它就会得到修复。

关于c# - 具有多个构造函数的 CaSTLe Windsor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1746387/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com