上級
IRequestService<T>
StructureMap を使用して、インターフェイスに対して TRequestService という名前のオブジェクトを返すアセンブリ スキャン ルールを定義できますか
例:
FooRequestService
IRequestService<FooRequest>
要求されたときに注入されるBarRequestService
IRequestService<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 を作成しようとしていますが、そこで何をすべきかについて行き詰まっています (主にリフレクションの経験がほとんどないため)。