Autofac 注入具有相同引用的对象

Autofac injects objects with the same reference

我一直在引用同一个对象。正如您在构造函数中看到的那样,有两个具有相同类型的对象。我希望得到两个不同的实例,但每当我设置 _player1 的 属性 时,_player2 就会相应地设置为相同的值。我究竟做错了什么? 谢谢

IoC 容器

public static void ConfigureContainer()
{
    var builder = new ContainerBuilder();

    builder.RegisterControllers(typeof(MvcApplication).Assembly);
    builder.RegisterInstance<IPlayer>(new Player());
    var container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}

控制器构造函数

public FlagGameController(IPlayer player1, IPlayer player2)
{
    _player1 = player1;
    _player2 = player2;
    _currentPlayer = player1;
}

当你说

 builder.RegisterInstance

您实际上是将其设置为始终 return 同一实例。如果您想每次 return 不同的实例,请使用

 builder.RegisterType<Player>().As<IPlayer>().InstancePerDependency();

ref - http://docs.autofac.org/en/latest/lifetime/instance-scope.html#instance-per-dependency

RegisterInstance方法告诉Autofac在容器内只注册一个IPlayer实例,它允许你注册一个单例。

下面的代码

builder.RegisterInstance<IPlayer>(new Player());

等同于

builder.RegisterInstance<IPlayer>(new Player()).SingleInstance();

或 builder.RegisterType().As().SingleInstance();

有关详细信息,请参阅 Registration Concepts - Instance components

如果你想拥有多个实例,请不要使用RegisterInstance方法,而是使用另一种注册方法。例如

builder.Register(c => new Player()).As<IPlayer>(); 

builder.RegisterType<Player>().As<IPlayer>(); 

Autofac 默认使用 InstancePerDependency 方法,它将注册配置为在每次解析时创建一个新实例。