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

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

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

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»Виндзорский компонент "concrete.two".

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

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

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

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

1 Ответ

1 голос
/ 02 сентября 2010
...