C# Autofac-单例接口解析为瞬态

C# Autofac-单例接口解析为瞬态,c#,inversion-of-control,autofac,C#,Inversion Of Control,Autofac,我正在构建一个WPF应用程序,并将Autofac用作IoC容器。该场景有点难以描述,但我将尝试在下面给出相关代码: My app bootstrapper包含以下代码,用于在My app中注册viewmodels: builder.RegisterAssemblyTypes(assemblySource) .Where(type => type.Name.EndsWith("ViewModel")) .Where(type => !string.IsNul

我正在构建一个WPF应用程序,并将Autofac用作IoC容器。该场景有点难以描述,但我将尝试在下面给出相关代码:

My app bootstrapper包含以下代码,用于在My app中注册viewmodels:

builder.RegisterAssemblyTypes(assemblySource)
       .Where(type => type.Name.EndsWith("ViewModel"))
       .Where(type => !string.IsNullOrWhiteSpace(type.Namespace) && type.Namespace.Contains("ViewModels"))
       .AssignableTo<INotifyPropertyChanged>()
       .AsSelf()
       .InstancePerDependency();
为了避免将容器传递到我的事件调度器中,我将按如下方式将其传递为委托:

builder.Register<ServiceFactory>(ctx => { return t => Container.Resolve(t ); });
builder.Register(ctx=>{returnt=>Container.Resolve(t);});
最后一段代码给我带来了一个问题:它导致实现
INotificationHandler
接口的ViewModels在每次调用时都创建了实例,而我只需要解决一个实例,而实现此通用接口的ViewModels在整个应用程序中将只创建一个实例

问题是:如何让Autofac解析实现
INotificationHandler
接口的ViewModels的单个实例,同时保留要创建的其他ViewModels
每个依赖项


谢谢。

您需要在第一次注册时排除实现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();
builder.RegisterAssemblyTypes(Assembly.GetEntryAssembly())
.Where(type=>type.Name.EndsWith(“视图模型”))
.Where(type=>!string.IsNullOrWhiteSpace(type.Namespace)和&type.Namespace.Contains(“ViewModels”))
.Where(type=>!type.IsAssignableFrom(typeof(INotificationHandler)))
.可转让给
.AsSelf()
.InstancePerDependence();

谢谢您的回答,但即使使用您的代码,我的问题仍然会出现。我应该在哪里进一步调查?你能展示一下容器建成后你的注册情况吗?再次感谢。我修复了我的注册,现在它可以正常工作了。
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();