7

我正在尝试让 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 的不同实例。我错过了什么吗?为什么会这样?

4

4 回答 4

11

我们今天遇到了类似的问题,这似乎是唯一一个提出这个问题的帖子,所以我想我会分享我们的经验,希望它能帮助别人。最后它就在我们眼前,当然它们通常是最难解决的问题:-)。

在我们的场景中,我们是:

  1. 注册配置提供程序的特定实现
  2. 在程序集中自动注册某些类型。

这些方面的东西:

var cb = new ContainerBuilder();
cb.RegisterType<FileBasedConfigurationProvider>()
    .As<IConfigurationProvider>()
    .SingleInstance();

cb.RegisterAssemblyTypes(typeof(MailProvider).Assembly)
    .Where(t => !t.IsAbstract && t.Name.EndsWith("Provider"))
    .AsImplementedInterfaces(); 

愚蠢的是,我们没有想到/意识到 和FileBasedConfigurationProvider是在同一个程序集中MailProvider,所以第二个注册调用基本上覆盖了第一个;因此,SingleInstance“没有工作”。

希望能帮助别人!

于 2014-01-16T00:32:37.060 回答
5

从您的代码中不清楚您如何存储/使用容器。您可能已经创建了多个容器。

于 2012-05-11T00:14:10.723 回答
1

在我的情况下,问题是生成第二个实例的方法的参数被定义为类而不是接口,即

SomeMethod(ClassName parameter)

代替

SomeMethod(**I**ClassName parameter)

明显的错误,但花了几分钟才看到它。

于 2018-03-06T16:38:36.227 回答
1

在我的例子中,我为一个类注册了两个不同的接口,声明每个都是单个实例。我假设会有一个类的单个实例......没有每个注册都有一个实例。

例如

builder.RegisterType<MyClass>().As<IMyFirstInterface>().SingleInstance();  // 1st instance 
builder.RegisterType<MyClass>().As<IMySecondInterface>().SingleInstance(); // 2nd instance

正确的做法是......

builder
    .RegisterType<MyClass>()
    .As<IMyFirstInterface>()
    .As<IMySecondInterface>()
    .SingleInstance();
于 2020-02-13T06:59:34.907 回答