Tôi đã có ứng dụng Web.Forms kế thừa được viết lại một phần cho MVC. Phần MVC sử dụng autofac như một container tiêm phụ thuộc.Autofac, MVC (với ActionFilters), Web.Forms - xung đột độ phân giải phụ thuộc
MVC phần có bộ lọc tùy chỉnh định nghĩa:
public class CustomActionFilter : ActionFilterAttribute
{
protected ILogger Logger { get; set; }
public CustomActionFilter(ILogger logger) { Logger = logger; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Logger.Log("OnActionExecuting");
}
}
Nó hoạt động tốt khi Web.Forms hội nhập bị vô hiệu hóa trong web.config. Hovewer, khi tôi cố gắng sử dụng tích hợp autofac Web.Forms, tôi đã có NullReferenceException liên quan đến AutofacFilterProvider
ở đâu đó trong autofac internals (stack trace).
- Global.asax.cs: http://pastebin.com/437Tnp0t
- web.config: http://pastebin.com/5pU6SH6c
Lưu ý rằng CustomActionFilter
được đăng ký như lọc toàn cầu, do đó nó được đăng ký với autofac:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(DependencyResolver.Current.GetService<CustomActionFilter>());
}
}
Tôi đã thử:
- sử dụng container riêng biệt cho MVC và Web.Forms - cùng kết quả
- Sử dụng tiêm bất động sản thay vì xây dựng - cùng kết quả
- Rõ ràng kích hoạt độ phân giải phụ thuộc vào các trang web.forms (như this) - làm việc
Vì vậy, câu hỏi đặt ra là, có cách nào để cung cấp độ phân giải phụ thuộc hậu trường cho cả phần MVC và web.forms. Tôi mới sử dụng autofac và phần nào mới cho các container tiêm phụ thuộc nói chung, vì vậy tôi chỉ có thể bỏ lỡ một cái gì đó hiển nhiên.
Cập nhật: lỗi không có liên quan gì với bộ lọc tùy chỉnh. Nếu tôi loại bỏ tất cả các tham chiếu đến các bộ lọc tùy chỉnh thì hành vi lỗi vẫn giống nhau, ngay cả theo dõi ngăn xếp.
Điều gì xảy ra nếu bạn nhận xét 'ContainerDisposalModule' và sau đó bạn có thể mở lại' PropertyInjectionModule' và 'AttributedInjectionModule'? Không được cần đến 'ContainerDisposalModule' vì Autofac.MVC bao gồm một' RequestLifetimeHttpModule' mới để phân bổ Lifetimscope được tạo ra trong yêu cầu ... – nemesv
@nemesv cùng một kết quả. – J0HN
OK, bây giờ tôi thấy vấn đề là gì ... bạn sẽ có các dịch vụ đã đăng ký với 'InstancePerHttpRequest' chưa? – nemesv