我有一个界面:
IRepository<T> where T : IEntity
虽然我正在使用一些虚假的存储库实现来破坏我的UI,这些虚拟存储库实现只返回任何旧数据。
他们看起来像这样:
public class FakeClientRepository : IRepository<Client>
目前我正在这样做:
ForRequestedType<IRepository<Client>>()
.TheDefaultIsConcreteType<FakeRepositories.FakeClientRepository>();
但是我所有的IEntities都有很多次。是否可以使用“扫描”为我们各自的IRepository自动注册我的所有虚假存储库?
编辑:这是我得到的,但我得到的错误说请求的类型没有注册:(
Scan(x =>
{
x.TheCallingAssembly();
x.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>();
x.AddAllTypesOf(typeof(IRepository<>));
x.WithDefaultConventions();
});
由于
安德鲁
答案 0 :(得分:14)
有一种更简单的方法可以做到这一点。有关详细信息,请参阅此博客帖子:Advanced StructureMap: connecting implementations to open generic types
public class HandlerRegistry : Registry
{
public HandlerRegistry()
{
Scan(cfg =>
{
cfg.TheCallingAssembly();
cfg.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>();
cfg.ConnectImplementationsToTypesClosing(typeof(IRepository<>));
});
}
}
这样做可以避免创建自己的ITypeScanner
或约定。
答案 1 :(得分:6)
感谢Chris,这正是我所需要的。为清楚起见,这是我在你的链接中所做的:
Scan(x =>
{
x.TheCallingAssembly();
x.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>();
x.With<FakeRepositoryScanner>();
});
private class FakeRepositoryScanner : ITypeScanner
{
public void Process(Type type, PluginGraph graph)
{
Type interfaceType = type.FindInterfaceThatCloses(typeof(IRepository<>));
if (interfaceType != null)
{
graph.AddType(interfaceType, type);
}
}
}
答案 2 :(得分:2)
从StructureMap用户组中查看此讨论:http://groups.google.com/group/structuremap-users/browse_thread/thread/649f5324c570347d