2010-04-12 36 views
2

我有一个接口,这样的事情:StructureMap - 扫描 - 以基本实现和具体的通用接口

interface IGenericSetupViewModel<T> 

我再有这样的默认implemtation,像这样

class GenericSetupViewModel<T> : IGenericSetupViewModel<T> 

对于一些具体类我有这样的具体实施:

class ContractSetupViewModel : GenericSetupViewModel<Contract> 

现在我想要使StructureMap返回正确的情况下,要求一个

ObjectFactory.GetInstance<GenericSetupViewModel<Contract>(); 

当我想获得ContractSetupViewModel退回,要求做别的事情的时候,我 想获得的

GenericSetupViewModel<T> 

我试过一个实例这样做:

 StructureMap.ObjectFactory.Configure(x => 
     { 
      x.Scan(y => 
      { 
       y.TheCallingAssembly(); 
       y.AddAllTypesOf(typeof(IGenericSetupViewModel<>)); 
       y.ConnectImplementationsToTypesClosing(typeof(IGenericSetupViewModel<>)); 
      }); 
     }); 

然而,这导致我总是得到一个GenericSetupViewModel和永不ContractSetupViewModel。 我不想指定所有特定的viewmodels,所以有无论如何,我可以让这个扫描工作?

+0

你有没有试过如果你要求'IGenericSetupViewModel '会发生什么? – flq 2010-04-12 08:23:40

+0

同样的事情,如果我问GenericSetupViewModel 2010-04-12 08:59:55

回答

3

有在StructureMap一个短命的臭虫ConnectImplementationToTypesClosing有麻烦,如果您的具体闭方式没有直接实现的接口。 一旦你获得最新版本的StructureMap的,下面的代码将工作:

StructureMap.ObjectFactory.Configure(x => 
{ 
    x.Scan(y => 
    { 
     y.TheCallingAssembly(); 
     y.ConnectImplementationsToTypesClosing(typeof(IGenericSetupViewModel<>)); 
    }); 
    x.For(typeof (IGenericSetupViewModel<>)).Use(typeof(GenericSetupViewModel<>)); 
}); 
+0

我试过更新,但是这仍然不起作用。 下面的代码仍然总是给我一个GenericSetupViewModel ,而不是一个ContractViewModel,注释掉,因为它显示的结果是它无法解决任何问题。 StructureMap.ObjectFactory.Configure(x => { x。扫描(y => y.TheCallingAssembly(); y.ConnectImplementationsToTypesClosing(typeof(IGenericSetupViewModel <>)); }); (typeSetofViewModel <>));使用(typeof(GenericSetupViewModel <>)); }); – 2010-04-12 16:13:47

+1

请看下面的测试,与最新的structuremap经过: http://github.com/structuremap/structuremap/blob/61c4b9b6d968b6bcce0e63fed5079902d0ab956e/Source/StructureMap.Testing/Bugs/CloseOpenGenericsWithSomeSpecifics.cs 你能作出这样的测试失败?与你的例子有什么不同?你有没有显示的附加注册码,可能有冲突? – 2010-04-13 01:00:42

+0

我发现这个问题,因为扫描仪工作的类需要公开,我的私人。 谢谢 – 2010-04-13 07:48:34

0

在你GetInstance方法,你应该这样做:

if (AnInstance is GenericSetupViewModel) 
    return AnInstance as GenericSetupViewModel; 
else if (AnInstance is ContractSetupViewModel) 
    return AnInstance as ContractSetupViewModel; 
+0

这正是我不想做的事情。 – 2010-04-12 09:00:53

+0

它可能不是你想要做的,但我看不到任何其他方式(离开我的头顶)。如果这不起作用,你应该重新考虑你的设计。 – James 2010-04-12 09:52:55

0

我不是太熟悉StructureMap,但是那也许是因为你是注册优先权欺骗?

由于您先拨打y.AddAllTypesOf(typeof(IGenericSetupViewModel<>));,首先会注册opene通用类GenericSetupViewModel<T>。此注册将满足您对GenericSetupViewModel<Contract>的解析请求,更具体的ContractSetupViewModel注册将被忽略。

也就是说,the Flattener sample清楚地表明,有一个开放的泛型类型注册和特定的封闭泛型类型注册应该工作。你能得到这种模式来处理你的类型吗?