2010-11-23 75 views
1

我必须做到以下几点:Structuremap打开通用命名实例

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需要我don3t知道,直到运行时类型参数?

回答

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没有共同的基本类型。

如果直到运行时才确定类型,那么泛型不会帮助大量 - 而是使ICommand<T>继承自一些常用接口,如ICommandBase--它具有您实际需要的方法。

不过,如果你只是不知道该方法类型,你可以通过包含如下的方法推入编译未知“向上”是通用的:

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

现在主叫的执行需要类型参数...但你可以再次推动它。注意最终你需要type参数。

+0

感谢您的回答 – Luka 2010-11-24 08:03:00