Castle Windsor根据构造函数中的另一个参数注入依赖项

时间:2013-07-10 10:00:38

标签: c# castle-windsor factory-pattern

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

1 个答案:

答案 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;
}

我知道这不是一种理想的做法,但它可以解决问题:)