如何使用Castle Windsor将正确的类型实例传递给MVC控制器?

时间:2010-09-02 03:37:38

标签: asp.net-mvc castle-windsor

我有一个似乎无法解决的问题。我确信这很简单,但我老实说无法弄明白。我有一个简单的类型,我在多个控制器上重用。我面临的问题是它是具有不同配置的SAME类型。我需要在不同的控制器上使用这种类型的不同实例。我把它简单地愚蠢到尽可能简单地试图解释它......

请考虑以下事项:

interface ISimpleType 
{ 
    string Value { get; } 
}

class ConcreteType : ISimpleType 
{
    private readonly string _value;

    public ConcreteType(string value) 
    { 
        _value = value; 
    } 

    public string Value { get { return _value; } }

}

在我的web.config中,我已经使用自己的id定义了两个相同类型的实例:

<component id="concrete.one" 
    service="MyApp.ISimpleType, MyApp" 
    type="MyApp.ConcreteType, MyApp">
  <parameters>
    <value>ONE</value>
  </parameters>
</component>

<component id="concrete.two" 
    service="MyApp.ISimpleType, MyApp" 
    type="MyApp.ConcreteType, MyApp">
  <parameters>
    <value>TWO</value>
  </parameters>
</component>

现在在我的MVC控制器上,我希望能够接受ISimpleType接口作为参数,但让它使用正确的ConcreteType实例,具体取决于参数名称:

public class FirstController : BaseController 
{ 
    public FirstController(ISimpleType firstType) : base(firstType) { ... }
}

public class SecondController : BaseController 
{
    public SecondController(ISimpleType secondType) : base(secondType) { ... }
}

我想将名为“firstType”的所有ISimpleType实例注册为使用Windsor组件“concrete.one”,并将所有名为“secondType”的ISimpleTypes注册为使用Windsor组件“concrete.two”。

我能看到的唯一选择是不将它作为参数传递,只需手动在构造函数中初始化它。

public FirstController()
{
    base.SimpleType = WindsorServiceFactory.Create<ISimpleType>("concrete.one");
}

有更好的方法吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)