4

私は Autofac を学んでいて、サービス間の依存関係を解決する方法を理解しようとしています。

次のクラスがあるとします。

class ClassA {}
class ClassB {}
class ClassC {}

class Classes
{
    public Classes(ClassA classA, ClassB classB, ClassC classC)
    {
        ...
    }
}

そして、以下の動作を模倣するようにクラスを登録したいと考えています。

var classA1 = new ClassA("A1");
var classB1 = new ClassB("B1");
var classC1 = new ClassC("C1");
var classes1 = new Classes(classA1, classB1, classC1);

var classA2 = new ClassA("A2");
var classB2 = new ClassB("B2");
var classC2 = new ClassC("C2");
var classes2 = new Classes(classA2, classB2, classC2);

つまり、、およびClassesの特定のインスタンスに依存します。それ、どうやったら出来るの?ClassAClassBClassC

4

2 に答える 2

5

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つあります。

  1. 新しいクラスを作成する代わりに、クラスの Register 呼び出しで NamedParameter インスタンスを再利用できる場合があります。無名関数の p パラメータは IEnumerable なので、可能かもしれません。
  2. このコードは、最新バージョンの Autofac (2.6.1) を使用してテストされました。
于 2012-05-02T17:06:55.320 に答える
3

最も簡単な方法は、ライフタイム スコープを使用することです。次のようにクラスを登録します。

builder.RegisterType<ClassA>().InstancePerLifetimeScope();
builder.RegisterType<ClassB>().InstancePerLifetimeScope();
builder.RegisterType<ClassC>().InstancePerLifetimeScope();

そして、次のようなライフタイム スコープを作成します。

var scope = container.BeginLifetimeScope();

コンテナからと同様にインスタンスを解決できるscopeようになりましたが、各スコープにはClassA、および の個別のインスタンスがClassBありClassCます。

于 2012-05-02T14:41:56.693 に答える