Autofac SingleInstance无法正常工作

时间:2012-05-10 23:10:04

标签: singleton autofac

我正在努力让Singleton实例使用Autofac。我正在使用Winforms做一个准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作为构造函数参数。但是,当我在传递给Command的Model中设置一个值时,该值不会出现在已使用CalculationsView设置的模型中。尽管调用了“singleInstance”方法,但似乎命令和视图正在传递CalculationsModel的不同实例。我错过了什么吗?为什么会这样?

4 个答案:

答案 0 :(得分:8)

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

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

  1. 注册配置提供程序的特定实现
  2. 在装配体中自动注册某些类型。
  3. 这些方面的东西:

    var cb = new ContainerBuilder();
    cb.RegisterType<FileBasedConfigurationProvider>()
        .As<IConfigurationProvider>()
        .SingleInstance();
    
    cb.RegisterAssemblyTypes(typeof(MailProvider).Assembly)
        .Where(t => !t.IsAbstract && t.Name.EndsWith("Provider"))
        .AsImplementedInterfaces(); 
    

    愚蠢的是,我们没有考虑/意识到FileBasedConfigurationProviderMailProvider在同一个程序集中,所以第二次注册调用基本上覆盖了第一个;因此,SingleInstance“无效”。

    希望能帮助其他人!

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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

SomeMethod(ClassName parameter)

而不是

SomeMethod(**I**ClassName parameter)

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

答案 3 :(得分:0)

在我的情况下,我为不同接口的一个类注册了两个,声明每个接口都是单个实例。我以为该类只有一个实例...不,每个注册都只有一个实例。

例如

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

正确的方法是...

builder
    .RegisterType<MyClass>()
    .As<IMyFirstInterface>()
    .As<IMySecondInterface>()
    .SingleInstance();