Spring.NET:枚举对象映射

时间:2011-03-02 18:06:33

标签: c# .net dependency-injection ioc-container spring.net

我有一个包含所有可能命令的枚举CommandType。我有很多类具有相同的基类Command

然后我可以使用如下代码配置特定对象:

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

现在我想通过Command值创建CommandType个实例(每次都是新实例;不是单例)。如何使用Spring.NET配置这样的映射?

1 个答案:

答案 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)时,都会创建一个新实例。