2011-03-21 29 views
13

Tôi có đăng ký sauautofac trong phiên bản v2.4.5.724

builder.Register<Func<Type, IRequestHandler>>(
      c => request => (IRequestHandler)c.Resolve(request)); 

Về cơ bản tôi đang cố gắng để đăng ký một phương pháp nhà máy mà giải quyết một thể hiện của IRequestHandler từ một loại nhất định.

Tính năng này hoạt động tốt cho đến phiên bản 2.4.3.700. Nhưng bây giờ tôi nhận được một lỗi sau ..

Không thể truy cập một đối tượng được xử lý. Tên đối tượng: 'Thao tác giải quyết này đã kết thúc. Khi đăng ký các thành phần bằng lambdas, thông số IComponentContext 'c' thành không thể lưu trữ lambda. Thay vào đó, hoặc giải quyết IComponentContext lại từ 'c' hoặc giải quyết một nhà máy sản xuất Func sau để tạo ra các thành phần sau. '.

CẬP NHẬT

Tôi đã cố gắng để hạn chế tiếp xúc autofac của phần còn lại của các dự án trong dung dịch. Nick, nhờ gợi ý, bây giờ đăng ký của tôi trông như thế này ...

builder.Register<Func<Type,IRequestHandler>>(c => 
     { 
      var handlers = c.Resolve<IIndex<Type,RequestHandler>>(); 
      return request => handlers[request]; 
     }); 

Trả lời

20

Các c trong biểu thức này là tạm thời, do đó, mã này trong khi trước đây chức năng, bị hỏng. Autofac 2.4.5 phát hiện vấn đề này trong khi các phiên bản trước đó âm thầm bỏ qua nó.

Để khắc phục vấn đề này, rõ ràng giải quyết IComponentContext:

builder.Register<Func<Type, IRequestHandler>>(c => { 
    var ctx = c.Resolve<IComponentContext>(); 
    return request => (IRequestHandler)ctx.Resolve(request)); 
}); 

Các chức năng bạn đang bắt chước ở đây có thể được biểu diễn tốt hơn sử dụng các phím và lập chỉ mục, ví dụ xem Interrupted chain of IoC hoặc http://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices.

0

Tôi gặp sự cố tương tự như user6130. Tôi muốn tránh sử dụng IIndex trong việc triển khai lớp của tôi và chuyển vào một trình phân giải dịch vụ vào hàm tạo của tôi để thay thế.

Vì vậy, bây giờ tôi có thực hiện dịch vụ của tôi với các nhà xây dựng sau đây:

public MvcMailer(Converter<string, MailerBase> mailerResolver) 
{ 
    _resolver = mailerResolver; 
} 

Tôi muốn sử dụng dịch vụ keyed mà không trực tiếp dựa trên namespace Autofac. Tôi đã nhận được lỗi tương tự cho đến khi tôi cấu trúc lại cấu hình như vậy.

1) Quét tất cả các cài bưu phẩm của tôi và chỉ số thông qua tên lớp (có thể được cải thiện)

builder.RegisterAssemblyTypes(System.Reflection.Assembly.GetExecutingAssembly()) 
     .Where(t => t.Name.EndsWith("Mailer")).Keyed<Mvc.Mailer.MailerBase>(t => t.Name.Replace("Mailer", "").ToLower()); 

2) Đăng ký chuyển đổi trong Autofac cấu hình

builder.Register<System.Converter<string,Mvc.Mailer.MailerBase>>(c => { 
    var all = c.Resolve<Autofac.Features.Indexed.IIndex<string,Mvc.Mailer.MailerBase>>(); 
     return delegate(string key) 
     { 
       return all[key]; 
     }; 
    }); 

3) Đăng ký như các loại linh kiện khác và để Autofac xử lý việc chuyển đổi tiêm

builder.RegisterType<Mailers.MvcMailer>().As<Mailers.IMailer>();