我需要使用Castle Windsor自动解析某些类型的服务,这些服务依赖于引用它们的构造函数的另一个参数。 这是一个简单的例子:
我要解决的服务是:
public interface IDependentParameter
{
IValue Value;
object Something;
}
实施者:
public class DependentParameter : IDependentParameter
{
public DependentParameter(IValue value)
{
Value = value;
}
public IValue Value;
public object Something;
}
IValue是我可以手动注入构造函数的另一项服务
我的依赖类似乎:
public class DependentClass : IDependentClass
{
IValue Value {get; protected set;}
IDependentParameter DependentParameter{get; protected set;}
public DependentClass (IValue value, IDependentParameter dependentParameter)
{
Value = value;
DependentParameter= dependentParameter;
}
}
解析代码应为:
var dependant = container.Resolve<IDependantClass>(new { value = knownValue });
在其他帖子中,我看到了引用AbstractFactory或TypedFactoryFacility的解决方案。但我在解决方案上看到的缺点是:
答案 0 :(得分:0)
如果我理解得很好,你希望Castle Windsor在解析DependentClass和DependentParameter时猜测他必须使用给定的Value实例。
使用当前版本的Castle,Dependencies的构造不使用初始参数列表。 所以你必须等到Castle实现这种行为(我甚至不知道它是否会在某一天完成)。
如果你没有足够的耐心,你可以做些什么,就是用一点技巧。 实际上,在解析依赖关系时,Castle中有一种方法可以保留上下文(以及参数列表),但这取决于依赖性本身。
一旦Dependency是Generic,就会保留上下文。
例如,您可以进行以下更改:
public class DependentParameter<T> : IDependentParameter where T : IValue
{
public DependentParameter(T value)
{
Value = value;
}
public T Value;
public object Something;
}
我知道这不是一种理想的做法,但它可以解决问题:)