C# Autofac从容器解析构造函数实例?

C# Autofac从容器解析构造函数实例?,c#,dependency-injection,autofac,C#,Dependency Injection,Autofac,如何在不传递实际实例的情况下注册一个将另一个类型作为其构造部分的类型。假设我注册了两种ISurface类型。我想注册一辆车,但我不想通过一个全新的实例。我想使用一个已经定义的曲面 根据他们声明的文件: Autofac看到IDateWriter映射到TodayWriter,因此开始创建 今天的作家 Autofac发现今天的编写器在其 构造函数 Autofac看到IOOutput映射到ConsoleOutput,因此创建了一个新的 控制台输出实例 那为什么我在登记汽车时必须通过高速公路呢?假设已

如何在不传递实际实例的情况下注册一个将另一个类型作为其构造部分的类型。假设我注册了两种ISurface类型。我想注册一辆车,但我不想通过一个全新的实例。我想使用一个已经定义的曲面

根据他们声明的文件:

  • Autofac看到IDateWriter映射到TodayWriter,因此开始创建 今天的作家
  • Autofac发现今天的编写器在其 构造函数
  • Autofac看到IOOutput映射到ConsoleOutput,因此创建了一个新的 控制台输出实例
那为什么我在登记汽车时必须通过高速公路呢?假设已注册两个曲面,如何指定现有曲面

var builder = new ContainerBuilder();
builder.RegisterType<Highway>().Named<ISurface>("Highway");
builder.RegisterType<Ocean>().Named<ISurface>("Ocean");

builder.RegisterType<Car>().Named<IVehicle>("Car").WithParameter("surface", new Highway());

这里有几件事你可以做:

选择1 这与你已经拥有的保持一致。您仍然可以使用
.WithParameter()
,但可以传入
ResolvedParameter
实例来解释要查找的参数以及如何实现参数:

builder.RegisterType<Car>().Named<IVehicle>( "Car" )
    .WithParameter(
        new ResolvedParameter(
            ( pInfo, ctx ) => pInfo.Name == "surface",
            ( pInfo, ctx ) => ctx.ResolveNamed<ISurface>( "Highway" )
            )
    );
选择2 此选项使用与lambda表达式的注册:

builder.Register( ( ctx ) => new Car( ctx.ResolveNamed<ISurface>( "Highway" ) ) ).Named<IVehicle>( "Car" );

为注册指定的默认生存期为
InstancePerDependency
,这意味着每次请求对象时,Autofac解析器都会提供该对象的新实例<代码>单实例本质上是一个单实例。您将只创建一个实例,每个请求都将返回该实例。这里有一个很好的解释。
builder.RegisterType<Car>().Named<IVehicle>( "Car" )
    .WithParameter(
    ( pInfo, ctx ) => pInfo.Name == "surface",
    ( pInfo, ctx ) => ctx.ResolveNamed<ISurface>( "Highway" ) );
builder.Register( ( ctx ) => new Car( ctx.ResolveNamed<ISurface>( "Highway" ) ) ).Named<IVehicle>( "Car" );
builder.RegisterType<Highway>().Named<ISurface>( "Highway" ).SingleInstance();
builder.RegisterType<Ocean>().Named<ISurface>( "Ocean" ).SingleInstance();