Autofac-Singleton接口解析为瞬态

时间:2018-07-15 18:48:16

标签: c# inversion-of-control autofac

我正在构建WPF应用程序,并将Autofac用作IoC容器。这种情况很难描述,但我将尝试在下面提供相关代码:

我的应用程序引导程序包含以下代码,以在我的应用程序中注册视图模型:

builder.RegisterAssemblyTypes(assemblySource)
       .Where(type => type.Name.EndsWith("ViewModel"))
       .Where(type => !string.IsNullOrWhiteSpace(type.Namespace) && type.Namespace.Contains("ViewModels"))
       .AssignableTo<INotifyPropertyChanged>()
       .AsSelf()
       .InstancePerDependency();

(请注意必须进行InstancePerDependency()调用,因为我显示了视图的许多实例)

然后我有以下代码来注册开放泛型的实现者:

builder.RegisterAssemblyTypes(assemblySource)
       .AsClosedTypesOf(typeof(INotificationHandler<>))
       .AsSelf()
       .SingleInstance();

为避免将容器传递到事件分配器中,我将其传递给委托,如下所示:

builder.Register<ServiceFactory>(ctx => { return t => Container.Resolve(t ); });

最后一段代码给我带来了一个问题:这导致实现INotificationHandler接口的ViewModel在每个调用中都创建了实例,而我只需要解析一次实例,并且ViewModels实现这个通用介面​​只会在整个应用程式中建立一个执行个体。

问题是:如何使Autofac解析实现INotificationHandler<T>接口的ViewModel的单个实例,同时保留要创建的其他PerDependency的ViewModel?

谢谢。

1 个答案:

答案 0 :(得分:0)

您需要在首次注册中排除实现 INotificationHandler <> 的ViewModel。因此,将您的首次注册更改为:

new_df = (df.set_index('Author')
          .join(df.sort_values('Year')
                .groupby('Author')
                .agg({'Year':['first', 'last']})))

>>> new_df
       Name of Publication  Year  (Year, first)  (Year, last)
Author                                                       
Name A               Pub A  1998           1998          2000
Name A               Pub C  2000           1998          2000
Name B               Pub B  2005           2005          2005
Name C               Pub A  1998           1998          1998