我想将 DispatcherNotifiedObservableCollection 作为 ObservableCollection 注入(inject)(且仅注入(inject))所有 ViewModel(位于 MyProject.ViewModels 中)。
使用 Ninject,我可以通过以下方式完成此任务:
Bind(typeof(ObservableCollection<>))
.To(typeof(DispatcherNotifiedObservableCollection<>))
.When(context => context.ParentContext.Binding
.Service.Namespace == "MyProject.ViewModels");
我从 Nicholas Blumhardt 那里学到:Autofac vs Ninject contextual binding?
Autofac 不提供此功能,但可以应用一些解决方法。
谢谢!
(抱歉我的英语不好)
编辑 1:更改标题以获得更好的描述。
编辑 2、3:更改内容和标题以获得更好的描述。
最佳答案
抱歉回复较慢。
使用 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
相反。
希望这有帮助,
尼克
关于autofac - 使用 Autofac 在特定命名空间中注入(inject)依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4846168/