Я думаю, что вы ищете 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)
вызывается, создается новый экземпляр.