我有一个包含所有可能命令的枚举CommandType
。我有很多类具有相同的基类Command
。
然后我可以使用如下代码配置特定对象:
<object type="Example.Command.MoveCommand">
<property name="StepSize" value="10" />
</object>
现在我想通过Command
值创建CommandType
个实例(每次都是新实例;不是单例)。如何使用Spring.NET配置这样的映射?
答案 0 :(得分:1)
我认为您正在寻找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>
,将枚举值映射到spring spring配置中的对象名称。然后使用当前的spring上下文来获取所需的对象:
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)
时,都会创建一个新实例。