2

上級

IRequestService<T>StructureMap を使用して、インターフェイスに対して TRequestService という名前のオブジェクトを返すアセンブリ スキャン ルールを定義できますか

例:

  • FooRequestServiceIRequestService<FooRequest>要求されたときに注入される
  • BarRequestServiceIRequestService<BarRequest>要求されたときに注入される

詳細

ジェネリック インターフェイスが定義されている

public interface IRequestService<T> where T : Request
{
    Response TransformRequest(T request, User current);
}

そして、このインターフェースを実装する複数の Request オブジェクトがあります

public class FooRequestService : IRequestService<Foo>
{
    public Response TransformRequest(Foo request, User current) { ... }
}

public class BarRequestService : IRequestService<Bar>
{
    public Response TransformRequest(Bar request, User current) { ... }
}

今、私はこれらのクラスを登録する必要がある時点にいます。これにより、StructureMap がそれらの作成方法を認識できるようになります。これは、コントローラーに次の ctor が必要なためです (StructureMap に a を挿入する必要がありますFooRequestService) 。

public MyController(IRequestService<Foo> fooRequestService) { ... }

今私の問題を回避するために、空のインターフェイスをFooRequestService実装しました。汎用インターフェイスを実装する代わりに、この空のインターフェイスを実装しています。

public interface IFooRequestService : IRequestService<Foo> { }

次に、私のコントローラー ctor はそのように見えます。これは、StructureMaps のデフォルト コンベンション スキャナーで動作します。

public MyController(IFooRequestService fooRequestService) { ... }

IRequestService<T>これらの空のインターフェイス定義を作成する必要がないように、StructureMap のアセンブリ スキャナーを使用して、TRequestService という名前のすべてのオブジェクト (T = "Foo"、"Bar" など) を登録するルールを作成するにはどうすればよいでしょうか?

何か他のものをミックスに投入するには、StructureMap のアセンブリ スキャンを処理しているときに、定義するアセンブリへの参照がないIRequestService<T>ため、これを行うときに何らかのリフレクションを使用する必要があります。「 Scan を使用したジェネリック型の StructureMap 自動登録」への回答をスキャンしましたが、その回答にはインターフェイス定義を含むアセンブリへの参照が必要なようです。

私はカスタム StructureMap.Graph.ITypeScanner を作成しようとしていますが、そこで何をすべきかについて行き詰まっています (主にリフレクションの経験がほとんどないため)。

4

1 に答える 1

2

あなたはスキャナーで正しい道を進んでいます。ありがたいことに、StructureMap に組み込まれているものがあります。残念ながら、この記事を書いている時点ではまだリリースされていません。トランクから最新のものを取得すると、スキャナー構成内で利用可能ないくつかの新しいものが表示されます。ニーズの例を以下に示します。

public class MyRegistry : Registry
{
    public MyRegistry()
    {
        Scan(x =>
        {
            x.TheCallingAssembly();
            //x.AssembliesFromApplicationBaseDirectory();
            x.WithDefaultConventions();
            x.ConnectImplementationsToTypesClosing(typeof (IRequestService<>));
        });
    }
}

最初に、スキャンに含めるアセンブリをスキャナー構成に伝える必要があります。アセンブリごとにレジストリを作成していない場合は、コメント付きのAssembliesFromApplicationBaseDirectory()メソッドも役立ちます。

ジェネリック型をコンテナーに入れるには、ConnectImplementationsToTypesClosingを使用します。

コンテナの設定時にレジストリを使用する設定方法の例については、 http ://structuremap.sourceforge.net/ConfiguringStructureMap.htm を参照してください。

必要に応じて、一般的なレジストリの使用をスキップして、ObjectFactory.Initialize内でスキャンを実行できます。

お役に立てれば。

于 2009-09-03T15:19:49.713 に答える