StructureMap使用Scan自动注册generics类型

我有一个界面:

IRepository where T : IEntity 

我正在使用一些虚假的存储库实现来破坏我的UI,只返回任何旧数据。

它们看起来像这样:

 public class FakeClientRepository : IRepository 

目前我这样做:

 ForRequestedType<IRepository>() .TheDefaultIsConcreteType(); 

但是对于我所有的IEntities都有很多次。 是否可以使用Scan自动注册我的所有虚假存储库以用于其各自的IRepository?

编辑:这是我得到的,但我得到错误说请求的类型没有注册:(

 Scan(x => { x.TheCallingAssembly(); x.IncludeNamespaceContainingType(); x.AddAllTypesOf(typeof(IRepository)); x.WithDefaultConventions(); }); 

谢谢

安德鲁

有一种更简单的方法可以做到这一点。 有关详细信息,请参阅此博客文章: 高级StructureMap:将实现连接到打开generics类型

 public class HandlerRegistry : Registry { public HandlerRegistry() { Scan(cfg => { cfg.TheCallingAssembly(); cfg.IncludeNamespaceContainingType(); cfg.ConnectImplementationsToTypesClosing(typeof(IRepository<>)); }); } } 

这样做可以避免必须创建自己的ITypeScanner或约定。

谢谢克里斯,这正是我所需要的。 为清楚起见,这是我在你的链接中所做的:

 Scan(x => { x.TheCallingAssembly(); x.IncludeNamespaceContainingType(); x.With(); }); private class FakeRepositoryScanner : ITypeScanner { public void Process(Type type, PluginGraph graph) { Type interfaceType = type.FindInterfaceThatCloses(typeof(IRepository<>)); if (interfaceType != null) { graph.AddType(interfaceType, type); } } } 

从StructureMap用户组中查看此讨论: http : //groups.google.com/group/structuremap-users/browse_thread/thread/649f5324c570347d