Autofac装饰使用装配扫描注册的开放式仿制药

ach*_*ekh 5 c# decorator autofac open-generics

我正在尝试将autofac装饰器支持功能应用到我的场景中,但没有成功.看起来在我的情况下,它没有正确地为注册分配名称.

有没有办法用名称注册扫描的程序集类型,以便我以后可以在开放的通用装饰器键中使用它?

或者也许我完全错了,在这里做一些不合适的事情?

builder.RegisterAssemblyTypes(typeof(IAggregateRepositoryAssembly).Assembly)
    .AsClosedTypesOf(typeof(IAggregateViewRepository<>)) //here I need name, probably
    .Named("view-implementor", typeof(IAggregateViewRepository<>))
    .SingleInstance();

builder.RegisterGenericDecorator(typeof(CachedAggregateViewRepository<>),
    typeof(IAggregateViewRepository<>), fromKey: "view-implementor");
Run Code Online (Sandbox Code Playgroud)

Nic*_*rdt 13

这是一次尝试,而不是在Visual Studio之前,因此重载决策可能不完全正确:

builder.RegisterAssemblyTypes(typeof(IAggregateRepositoryAssembly).Assembly)
    .As(t => t.GetInterfaces()
              .Where(i => i.IsClosedTypeOf(typeof(IAggregateViewRepository<>))
              .Select(i => new KeyedService("view-implementor", i))
              .Cast<Service>())
    .SingleInstance();
Run Code Online (Sandbox Code Playgroud)
  • Named()只是语法糖Keyed(),它将组件与a相关联KeyedService
  • As() 接受一个 Func<Type, IEnumerable<Service>>

您还需要:

using Autofac;
using Autofac.Core;
Run Code Online (Sandbox Code Playgroud)