Autofac - 将单例接口解析为瞬态

3
我正在构建一个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在每次调用时都会创建新的实例,而我只需要解析一次实例,并且实现这个通用接口的ViewModel在整个应用程序中只创建一个实例。
问题是:如何使Autofac解析实现了INotificationHandler<T>接口的ViewModel的单个实例,同时保持其他ViewModel被创建为PerDependency
谢谢。
1个回答

2

您需要在第一次注册时排除实现了INotificationHandler<>的ViewModels。因此,请将您的第一次注册更改为:

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

谢谢您的回答,但即使使用了您的代码,我的问题仍然存在。我应该在哪里进一步调查? - Wahib Mkadmi
你能展示一下容器构建完成后,你的注册情况吗? - Thomas T
谢谢,我已经修复了我的注册问题,现在它可以正常工作了。 - Wahib Mkadmi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接