Autofac:注册依赖于其他类的特定实例的类

And*_*ren 3 c# dependency-injection autofac

我只是在学习Autofac,并试图了解如何计算服务之间的依赖关系。

说我有以下课程:

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

class Classes
{
    public Classes(ClassA classA, ClassB classB, ClassC classC)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

并且我想注册这些类,以便模仿以下行为。

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);
Run Code Online (Sandbox Code Playgroud)

总之,Classes是依赖于特定实例ClassAClassBClassC。我怎么做?

小智 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"));
Run Code Online (Sandbox Code Playgroud)

前三个寄存器调用告诉Autofac,当它要构建ClassA(或B或C)的实例时,必须使用从名称为“ a”(或“ b”或“ c”的NamedParameter实例中提取值)的方法。 ”),然后将该值传递给ClassA的构造函数。NamedParameter对象将作为Resolve调用的一部分传递,例如Resolve<ClassA>(new NamedParameter("a", "AAAA"))

最后的注册调用告诉​​Autofac,它必须解析ClassA,ClassB和ClassC的实例,并将这些实例传递给Classes的构造函数。为了解决这些依赖关系,Autofac必须从传入的NamedParameter的某些实例中提取值,然后将这些值传递到新NamedParameter实例的“解决”中。

有两件事要注意。

  1. 可以在类的Register调用中重用NamedParameter实例,而不用创建新实例。匿名函数的p参数是IEnumerable,因此它是可能的。
  2. 该代码已经使用最新版本的Autofac(2.6.1)进行了测试。