9

我有一个界面:

IRepository<T> where T : IEntity

当我使用一些只返回任何旧数据的假存储库实现来敲我的 UI 时。

它们看起来像这样:

public class FakeClientRepository : IRepository<Client>

目前我正在这样做:

ForRequestedType<IRepository<Client>>()
   .TheDefaultIsConcreteType<FakeRepositories.FakeClientRepository>();

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

编辑:据我所知,但我收到错误说请求的类型未注册:(

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

谢谢

安德鲁

4

3 回答 3

14

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

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

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

于 2010-06-03T17:20:33.747 回答
6

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

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);
        }
    }
} 
于 2009-02-06T09:25:13.260 回答
2

看看来自 StructureMap 用户组的讨论:http ://groups.google.com/group/structuremap-users/browse_thread/thread/649f5324c570347d

于 2009-02-05T17:35:26.217 回答