C# 在Autofac中注册时如何避免使用“新”两次

C# 在Autofac中注册时如何避免使用“新”两次,c#,dependency-injection,autofac,C#,Dependency Injection,Autofac,我想使用带参数的构造函数注册两个依赖项,但我只想在“Dependency”类上创建一次“new”。 与此相反: builder.RegisterInstance(new ClassA(new Dependency())).As<IClassA>().SingleInstance(); builder.RegisterInstance(new ClassB(new Dependency())).AsSelf().SingleInstance(); builder.RegisterIn

我想使用带参数的构造函数注册两个依赖项,但我只想在“Dependency”类上创建一次“new”。 与此相反:

builder.RegisterInstance(new ClassA(new Dependency())).As<IClassA>().SingleInstance();
builder.RegisterInstance(new ClassB(new Dependency())).AsSelf().SingleInstance();
builder.RegisterInstance(新类A(新依赖项()).As().SingleInstance();
RegisterInstance(新类B(新依赖项()).AsSelf().SingleInstance();
我想要这样的东西:

Dependency dependency = new Dependency();
builder.RegisterInstance(new ClassA(dependency)).As<IClassA>().SingleInstance();
builder.RegisterInstance(new ClassB(dependency)).AsSelf().SingleInstance();
Dependency=newdependency();
RegisterInstance(新类A(依赖项)).As().SingleInstance();
builder.RegisterInstance(新类B(依赖项)).AsSelf().SingleInstance();

假设您希望实例化该类型而不是向Autofac注册它,Autofac将为您完成此操作,那么您应该使用
注册
而不是
注册状态

builder.RegisterType<Dependency>().As<Dependency>().SingleInstance();
builder.Register(t => new ClassA(t.Resolve<Dependency>())).As<IClassA>().SingleInstance();
builder.RegisterType().As().SingleInstance();
Register(t=>newclassa(t.Resolve()).As().SingleInstance();

然后,您可以使用传入的
IComponentContext
解析任何必需的依赖项。请记住,使用
SingleInstance
时,您的实例只创建一次,因此依赖项的范围应该类似(不要期望每个请求依赖项在每次调用singleton时“更新”自身)。

如果您先注册依赖项,则如果新实例需要,它应该自动传递给新实例

假设:

public class ClassA : IClassA
{
    public ClassA(Dependency dependency)
    {
    }
 }

public class ClassB
{
    public ClassB(Dependency dependency)
    {
    }
 }
然后注册依赖项

var dependency = new Dependency();
builder.RegisterInstance(dependency).As<Dependency>();
builder.RegisterType<ClassA>().As<IClassA>().SingleInstance();
builder.RegisterType<ClassB>().AsSelf().SingleInstance();
var dependency=newdependency();
RegisterInstance(dependency.As();
builder.RegisterType().As().SingleInstance();
builder.RegisterType().AsSelf().SingleInstance();

我尝试了这种方法,但问题是ClassA有两个构造函数,带参数和不带参数。我想使用具有参数的构造函数。如果我不传递参数,当我尝试解析ClassA时,Autofac使用没有参数的构造函数。为了解决这个问题,我使用了
builder.Register(t=>newclassa(t.Resolve()).AsSelf().SingleInstance()如@Igor所回答,但新代码仍在执行。我只需要创建一个新的依赖项。将依赖项注册为:builder.RegisterType().AsSelf().SingleInstance()。。那么它应该只更新一次