我想将DispatcherNotifiedObservableCollection注入(并且只进入)所有ViewModel(位于MyProject.ViewModels中)作为ObservableCollection。
使用Ninject,我可以通过以下方式完成此任务:
Bind(typeof(ObservableCollection<>))
.To(typeof(DispatcherNotifiedObservableCollection<>))
.When(context => context.ParentContext.Binding
.Service.Namespace == "MyProject.ViewModels");
我从尼古拉斯·布鲁姆哈特那里学到:Autofac vs Ninject contextual binding?
Autofac不提供此功能,但可以应用一些解决方法。
谢谢!
(对不起我的英文)
编辑1:更改了标题以获得更好的描述。
编辑2,3:更改内容和标题以获得更好的描述。
答案 0 :(得分:8)
对于缓慢的回复感到抱歉。
使用Autofac最好的办法是使用规则注册ViewModel
并应用参数来解决ObservableCollection<>
的不同实现:
// Default for other components
builder.RegisterGeneric(typeof(ObservableCollection<>));
// Won't be picked up by default
builder.RegisterGeneric(typeof(DispatcherNotifiedObservableCollection<>))
.Named("dispatched", typeof(ObservableCollection<>));
var viewModelAssembly = typeof(AViewModel).Assembly;
builder.RegisterAssemblyTypes(viewModelAssembly)
.Where(t => t.Name != null && t.Name.EndsWith("ViewModel"))
.WithParameter(
(pi, c) => pi.ParameterType.IsClosedTypeOf(typeof(ObservableCollection<>)),
(pi, c) => c.ResolveNamed("dispatched", pi.ParameterType));
using Autofac;
您需要IsClosedTypeOf()
。此外,如果您使用的Autofac版本不支持WithParameter()
的此重载,则可以使用需要Parameter
的重载并传递ResolvedParameter
。
希望这有帮助,
尼克