autofac - 使用 Autofac 在特定命名空间中注入(inject)依赖项

标签 autofac

我想将 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/

相关文章:

c# - 如何使 autofac KeyFilter 在 asp.net-core web api 中工作?

dependency-injection - IoC : ProjectReference with ReferenceOutputAssembly = false, 但仍然想要 nuget 包

c# - 使用 Autofac 在我的组件类 Azure Functions 中注入(inject) ILogger 实例

c# - 未使用“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”找到任何构造函数

c# - 使用 Autofac 注册容器本身

azure - 如何解决Azure角色部署中的System.Web.Http TypeLoadException?

c# - 解决 Module 类中的 AutoFac 依赖关系

c# - Autofac 属性注入(inject)失败

autofac - 在 autofac 中使用模块和配置文件

Autofac Register 和 RegisterType 的区别