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是依赖于特定实例ClassA,ClassB和ClassC。我怎么做?
小智 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实例的“解决”中。
有两件事要注意。