【发布时间】:2012-05-10 23:10:03
【问题描述】:
我正在尝试让 Singleton 实例与 Autofac 一起使用。我有点用 Winforms 做一个 quasi-mvvm 类型的事情,只是一个实验,所以不要挂断电话。但我正在尝试让我的模型成为在命令中引用的单个实例(此处的 ICommand 不是 WPF 变体):
我有以下容器设置:
var cb = new ContainerBuilder();
cb.RegisterType<CalculateCommissionCommand>().As<ICommand<TradeEntry>>().SingleInstance();
cb.RegisterType<CalculationsModel>().As<ICalculationsModel>().SingleInstance();
cb.Register(c => new CalculationsView() { Model = c.Resolve<ICalculationsModel>() }).SingleInstance();
cb.Build();
现在,Command 将 ICalculationsModel 作为构造函数参数。但是,当我在传递给命令的模型中设置一个值时,该值不会出现在已经使用 CalculationsView 设置的模型中。尽管调用了“singleInstance”方法,但似乎命令和视图正在传递 CalculationsModel 的不同实例。我错过了什么吗?为什么会这样?
【问题讨论】:
-
当我进行一些挖掘并放入一个带有本地自动递增实例化字段的静态计数器时,我看到实际上 autofac 每次都在创建新实例。传递给视图的实例 ID=1,传递给命令的实例 ID=2。只有当构造函数被调用两次时才会发生这种情况。是什么赋予了? Autofac 不会那么坏吧?
-
在构造函数中下断点,看看是不是真的发生了两次
-
是的。构造函数被调用了两次。
-
从您的代码中不清楚您是如何存储/使用容器的,您是否有可能创建了多个容器?绝对不是 autofac 错了。
-
实例化如下:ServiceLocator.SetLocatorProvider(() => new AutofacServiceLocator(ConfigureContainer()));我原始帖子中的上述代码包含在“配置容器”中,我从中返回 cb.Build()。然后我使用 ServiceLocator.Current.GetInstance<...>()。你认为是 serviceLocator 创建了容器的副本?嗯……我们来看看。