9

私はインターフェースを持っています:

IRepository<T> where T : IEntity

古いデータを返すだけの偽のリポジトリ実装を使用して、UI をノックアップしています。

それらは次のようになります。

public class FakeClientRepository : IRepository<Client>

現時点ではこれをやっています:

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

しかし、私のすべての IEntity には何度も時間がかかります。Scan を使用して、すべての偽のリポジトリをそれぞれの IRepository に自動登録することはできますか?

編集:これは私が得た限りですが、要求されたタイプが登録されていないというエラーが表示されます:(

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

ありがとう

アンドリュー

4

3 に答える 3

14

これを行う簡単な方法があります。詳細については、このブログ投稿を参照してください: Advanced StructureMap: 実装をオープン ジェネリック型に接続する

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 に答える