Как я могу передать правильный экземпляр типа контроллеру MVC с помощью Castle Windsor?

У меня есть проблема, которую я не могу решить. Я уверен, что это просто, но я, честно говоря, не могу понять это. У меня есть простой тип, который я повторно использую на нескольких контроллерах. Проблема, с которой я столкнулся, заключается в том, что это один и тот же тип с разными конфигурациями. Мне нужно, чтобы разные экземпляры этого типа использовались на разных контроллерах. Я упростил это так просто, как только мог, чтобы попытаться объяснить это...

Рассмотрим следующее:

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 я определил два экземпляра одного типа со своими собственными идентификаторами:

<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) { ... }
}

Я хотел бы зарегистрировать все экземпляры ISimpleType с именем "firstType" для использования компонента Windsor "concrete.one" и все экземпляры ISimpleTypes с именем "secondType" для использования компонента Windsor "concrete.two".

Единственная альтернатива, которую я вижу, - это НЕ передавать это как параметр и просто инициализировать его в конструкторе вручную.

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

Есть ли способ лучше?

Заранее спасибо!


person Luc    schedule 02.09.2010    source источник


Ответы (1)