这是一个例子:
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");
}
};
Run Code Online (Sandbox Code Playgroud)
所有这些组件都在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>())));
Run Code Online (Sandbox Code Playgroud)
它有效,但可能Castle Windsor提供了一些更好的方法吗?
任何帮助都非常感谢.
谢谢.
我目前正在进行转换,从使用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...
// -----------------------------------------------
}
Run Code Online (Sandbox Code Playgroud)
为了对应这段代码,我在应用程序的配置文件中设置了以下条目:
<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>
Run Code Online (Sandbox Code Playgroud)
对我来说,一切看起来都应该如此.当我尝试解析IObjectContextFactory服务的实例时,我检索一个ObjectContextFactory对象.当我尝试解析IUserRepository服务的实例时,我的问题出现了.我受到以下令人愉快的例外处理:
无法创建组件'userRepository',因为它具有要满足的依赖性.userRepository正在等待以下依赖项: …