Structuremap打开通用命名实例

时间:2010-11-23 14:58:56

标签: c# generics structuremap named-instance

我必须做以下事情:

var someType = ObjectFactory.GetNamedInstance("myNamedInstance");

其中someType可以是ICommand的任何实现。

所以我注册了其中一些:

For(typeof(ICommand<>)).Use(typeof(Command1)).Named("myNamedInstance1");
For(typeof(ICommand<>)).Use(typeof(Command2)).Named("myNamedInstance2");

有没有办法在StructureMap中执行此操作,因为GetNamedInstance需要我在运行时才知道的type参数。?

1 个答案:

答案 0 :(得分:2)

(为此,我假设创建了ICommand<T>

这实际上没有任何意义......想到这一行:

//where aString is either myNamedInstance1 or myNamedInstance2
var someType = ObjectFactory.GetNamedInstance(aString);

现在假设您不打算使用var,而是使用实际类型。你会在那里编译什么?也就是说,someType可能是哪种类型而不是object

另外,请记住ICommand<string>ICommand<int>都是来自ICommand<T>的构造类型,但不相关 - 它们除了object之外没有共同的基本类型。< / p>

如果直到运行时才输入类型,泛型不会帮助一堆 - 而是让你的ICommand<T>继承一些常见的接口 - 比如ICommandBase - 它有你真正需要的方法

但是,如果您只是不知道该方法中的类型,则可以通过使包含该泛型的方法在编译中推送未知的“up”:

public void Execute<T>( string commandName)
{        
    var someType = ObjectFactory.GetNamedInstance<ICommand<T>>(commandName);
    someType.Execute();
}

现在执行的调用者需要类型参数...但是你可以再次推动它。请注意,最终您将需要type参数。