在Autofac中获取一个接口的所有已注册实现

本文关键字:接口 实现 注册 一个 Autofac 获取 | 更新日期: 2023-09-27 17:49:37

我需要从IComponentContext中获得实现特定接口的注册Type列表。

我不想要类型的实际实例,而是一个我可以获得实例的Type列表。

我想使用此列表在消息总线上生成订阅。

如何在autoface中获得所有已注册的接口实现?

在Autofac中获取一个接口的所有已注册实现

我想明白了——

var types = scope.ComponentRegistry.Registrations
    .SelectMany(r => r.Services.OfType<IServiceWithType>(), (r, s) => new { r, s })
    .Where(rs => rs.s.ServiceType.Implements<T>())
    .Select(rs => rs.r.Activator.LimitType);

使用AutoFac 3.5.2(基于本文:http://bendetat.com/autofac-get-registration-types.html)

首先实现这个函数:

    using Autofac;
    using Autofac.Core;
    using Autofac.Core.Activators.Reflection;
    ...
        private static IEnumerable<Type> GetImplementingTypes<T>(ILifetimeScope scope)
        {
            //base on http://bendetat.com/autofac-get-registration-types.html article
            return scope.ComponentRegistry
                .RegistrationsFor(new TypedService(typeof(T)))
                .Select(x => x.Activator)
                .OfType<ReflectionActivator>()
                .Select(x => x.LimitType);
        }

然后假设我们有builder

var container = builder.Build();
using (var scope = container.BeginLifetimeScope())
{
   var types = GetImplementingTypes<T>(scope);
}