我正在构建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?
谢谢。
答案 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