【发布时间】:2011-12-17 02:55:06
【问题描述】:
示例如下:
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>())));
它有效,但温莎城堡可能提供了一些更好的方法来做到这一点?
非常感谢任何帮助。
谢谢。
【问题讨论】:
-
如果它适合您的模型,您可以尝试使用 Typed Factory 工具。我相信它会自动选择与您传递给工厂方法的参数匹配的构造函数。这意味着您必须有一个工厂和一个该类型的实例才能传入。如果您最终保留现有代码,并且在同一个安装程序中注册两者,并且如果
ComponentB没有依赖项,请考虑完全跳过IComponentB/IComponentA的注册。 -
This question 和一些 cmets(例如
ISubDependencyResolver)也可能有用。 -
为什么使用哪个 .ctor 很重要?
-
@Krzysztof Koźmic构造函数
ComponentC(IComponentA)自己创建IComponentB,不要使用容器中的IComponentB。ComponentC(IComponentB)自己创建IComponentA,不要使用容器中的IComponentA。因此,ComponentC在这些情况下的行为是不同的。 -
我想说你的班级可能有两个职责,也许你应该把它们分开?
标签: c# .net dependency-injection castle-windsor ioc-container