Castle Windsor根据构造函数中的另一个参数注入依赖项
本文关键字:参数 另一个 注入 依赖 Windsor 构造函数 Castle | 更新日期: 2023-09-27 18:21:51
我需要使用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的解决方案。但我看到的解决方案的缺点是:
- 仅通过查看DependentClass构造函数无法知道需要哪些服务(我们将只看到工厂服务)
- 如何实现工厂,以便它可以引用castle windsor容器来解析IDdependentParameter,而不是new关键字。我绝对需要一个使用castle的instagriation,因为我正在创建动态代理
如果我理解得很好,你会希望Castle Windsor猜测他在解析DependentClass AND DependentParameter时必须使用给定的Value实例。
对于当前版本的Castle,Dependencies的构造不使用初始参数列表。所以你必须等到Castle实现这个行为(我甚至不知道是否有一天会实现)。
如果你不够耐心,你能做的就是使用一个小技巧。事实上,Castle中有一种方法可以在解析依赖项时保留上下文(以及参数列表),但这取决于依赖项本身。
一旦依赖项是Generic,上下文就会被保存。
例如,在您的情况下,您可以进行以下更改:
public class DependentParameter<T> : IDependentParameter where T : IValue
{
public DependentParameter(T value)
{
Value = value;
}
public T Value;
public object Something;
}
我知道这不是一个理想的方法,但它很成功:)