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根据构造函数中的另一个参数注入依赖项

如果我理解得很好,你会希望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;
}

我知道这不是一个理想的方法,但它很成功:)