から、特定のインターフェイスを実装するIComponentContext
登録済みのリストを取得する必要があります。Type
タイプの実際のインスタンスは必要ありませんが、インスタンスを取得できるリストがType
必要です。
このリストを使用して、メッセージ バスでサブスクリプションを生成したいと考えています。
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);
}