1

我需要使用 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 构造函数无法知道需要哪些服务(我们将只看到工厂服务)。
  • 如何实现工厂,以便它可以引用城堡温莎容器来解析 IDependentParameter 而不是 new 关键字。我绝对需要使用城堡的实例化,因为我正在创建动态代理。
4

1 回答 1

0

如果我理解得很好,您希望 Castle Windsor 猜测他在解析 DependentClass AND 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;
}

我知道这不是一个理想的方法,但它使伎俩:)

于 2013-07-10T16:58:31.907 回答