Spring.NET: Enum для сопоставления объектов - PullRequest
0 голосов
/ 02 марта 2011

У меня есть enum CommandType со всеми возможными командами. И у меня много классов с одинаковым базовым классом Command.

Затем я могу настроить конкретные объекты, используя код, подобный следующему:

<object type="Example.Command.MoveCommand">
    <property name="StepSize" value="10" />
</object>

Теперь я хотел бы создать Command экземпляров (каждый раз новый; не единичный) по значению CommandType. Как настроить такое сопоставление с помощью Spring.NET?

1 Ответ

1 голос
/ 04 марта 2011

Я думаю, что вы ищете ServiceLocator функциональность, которую я не думаю, что вы можете достичь с помощью Spring.net, только изменив конфигурацию.Обратите внимание, что шаблон ServiceLocator, как правило, не рекомендуется с точки зрения внедрения зависимостей, потому что он заставляет ваш объект знать о своем контейнере di.

Если вам нужен ServiceLocator и вы не против связыватьваш объект в контейнере Spring DI, следующий может быть решением.

Я предполагаю, что ваш текущий код выглядит примерно так:

public class CommandManager
{
  Dictionary<CommandType, Command> { get; set; } // set using DI

  public Command GetBy(CommandType cmdKey)
  {
    return Dictionary[cmdKey];
  } 
}

Сопоставьте значения перечисления симена объектов в вашем весеннем конфиге, заменив текущий Dictionary<CommandType, Command> на Dictionary<CommandType, string>.Затем используйте текущий контекст пружины, чтобы получить нужный объект:

using Spring.Context;
using Spring.Context.Support;

public class CommandManager
{
  Dictionary<CommandType, string> { get; set; } // set using DI; values are object names

  public Command GetBy(CommandType cmdKey)
  {
    string objName = Dictionary[cmdKey];
    IApplicationContext ctx = ContextRegistry.GetContext();

    return (Command)ctx.GetObject(objName);
  } 
}

Не забудьте установить область действия объектов вашей команды на prototype:

<object name="moveCommand" 
        type="Example.Command.MoveCommand, CommandLib"
        scope="prototype">
    <property name="StepSize" value="10" />
</object>

Теперь каждый разCommandManager.GetBy(myKey) вызывается, создается новый экземпляр.

...