Autofac使用相同的引用注入对象

时间:2015-07-22 15:07:25

标签: c# autofac

我一直在引用同一个对象。正如您在构造函数中看到的那样,有两个具有相同类型的对象。我希望得到两个不同的实例,但每当我设置_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;
}

2 个答案:

答案 0 :(得分:2)

当你说

 builder.RegisterInstance

实际上,您将其设置为始终返回相同的实例。如果要每次都返回不同的实例,请使用

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

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

答案 1 :(得分:0)

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

以下代码

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

相当于

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

或     。builder.RegisterType()为()SingleInstance();

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

如果您想拥有多个实例,请不要使用RegisterInstance方法,而是使用其他注册方法。例如

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

builder.RegisterType<Player>().As<IPlayer>(); 
默认情况下,

Autofac 使用 InstancePerDependency 方法,该方法将注册配置为每次解析时创建新实例。