Classes クラスの一意のインスタンスを複数作成できるようにする場合は、Autofacのパラメーター受け渡し機能を使用して登録を作成します。私のコードは次のようになります
var builder = new ContainerBuilder();
builder.Register((c,p) => new ClassA(p.Named<string>("a")));
builder.Register((c,p) => new ClassB(p.Named<string>("b")));
builder.Register((c,p) => new ClassC(p.Named<string>("c")));
builder.Register((c,p) => new Classes(
c.Resolve<ClassA>(new NamedParameter("a", p.Named<string>("ClassA"))),
c.Resolve<ClassB>(new NamedParameter("b", p.Named<string>("ClassB"))),
c.Resolve<ClassC>(new NamedParameter("c", p.Named<string>("ClassC")))));
var container = builder.Build();
var classes = container.Resolve<Classes>(
new NamedParameter("ClassA", "AAAA"),
new NamedParameter("ClassB", "BBBB"),
new NamedParameter("ClassC", "CCCCC"));
最初の 3 つの登録呼び出しは、Autofac に、ClassA (または B または C) のインスタンスを構築する場合、「a」(または「b」または「c」) の名前を持つ NamedParameter のインスタンスから値を抽出する必要があることを伝えています。 ") そしてその値を ClassA のコンストラクターに渡します。NamedParameter オブジェクトは、 のように Resolve 呼び出しの一部として渡されますResolve<ClassA>(new NamedParameter("a", "AAAA"))
。
最後の登録呼び出しは、ClassA、ClassB、および ClassC のインスタンスを解決し、それらのインスタンスを Classes のコンストラクターに渡す必要があることを Autofac に伝えています。これらの依存関係を解決するために、Autofac は、渡された NamedParameter のいくつかのインスタンスから値を抽出し、それらを新しい NamedParameter インスタンスの Resolve に渡す必要があります。
注意すべきことが2つあります。
- 新しいクラスを作成する代わりに、クラスの Register 呼び出しで NamedParameter インスタンスを再利用できる場合があります。無名関数の p パラメータは IEnumerable なので、可能かもしれません。
- このコードは、最新バージョンの Autofac (2.6.1) を使用してテストされました。