2012-12-27 9 views
5

Tôi cần nhận được, từ một số IComponentContext, một danh sách đăng ký Type đã đăng ký thực hiện một giao diện cụ thể.Nhận tất cả các triển khai đã đăng ký của một giao diện trong Autofac

Tôi không muốn các phiên bản thực tế của các loại, mà là danh sách Type trong đó tôi có thể có các phiên bản.

Tôi muốn sử dụng danh sách này để tạo đăng ký trên xe buýt thông báo.

Làm thế nào để tôi nhận được tất cả các triển khai đã đăng ký của giao diện trong Autofac?

+1

Bạn đã thử sử dụng Reflection để lặp qua tất cả các loại trong một assembly và kiểm tra xem chúng có thực thi 'IComponentContext' không? Xem [Bắt tất cả các loại thực hiện giao diện với C# 3.5] (http://stackoverflow.com/questions/26733/getting-all-types-that-implement-an-interface-with-c-sharp-3-5) –

+0

@NikolayKhil Đó không phải là câu hỏi. Tôi cần phải xem xét thông qua bối cảnh và tìm các loại đăng ký. Đây là một câu hỏi cụ thể của Autofac. –

Trả lời

13

tôi figured này ra -

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); 
+0

ServiceType không có phương pháp Thực hiện! –

+1

Nó vẫn hoạt động với Autofac mới nhất. –

0

Với AutoFac 3.5.2 (dựa trên bài viết này: http://bendetat.com/autofac-get-registration-types.html)

đầu tiên thực hiện chức năng này:

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); 
     } 

sau đó giả chúng tôi có builder,

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