2012-10-16 28 views
5

Tôi có một ELMAH tùy chỉnh ErrorLog có sử dụng một bối cảnh EF Code-Đầu tiên để lưu trữ các lỗi: -Tôi có thể tiêm phụ thuộc vào một ErrorLog tùy chỉnh ELMAH như thế nào?

class EntityFrameworkElmahErrorLog 
{ 
    public EntityFrameworkElmahErrorLog(IDictionary config) : this() { } 

    public override ErrorLogEntry GetError(string id) 
    { 
     using (var context = new MyContext()) 
     { 
      var intId = Int64.Parse(id, CultureInfo.InvariantCulture); 
      var item = context.ErrorLog.Single(x => x.Id == intId); 
      return new ErrorLogEntry(this, id, ErrorXml.DecodeString(item.Details)); 
     } 
    } 

    // etc. 

} 

Các ErrorLog là dây lên trong web.config: -

<errorLog type="MyProject.EntityFrameworkErrorLog, MyProject" /> 

tôi m đã sử dụng Ninject ở nơi khác trong dự án. Tôi muốn tiêm MyContext để các ErrorLog không instantiating phụ thuộc của riêng mình, nhưng tôi không có bất kỳ may mắn tìm kiếm một móc trong tài liệu hướng dẫn. ELMAH xuất hiện để khởi tạo ErrorLog nội bộ, do đó, tùy chọn duy nhất tôi dường như có đang sử dụng một ServiceLocator bên trong tùy chỉnh ErrorLog, mà tôi muốn tránh nếu có thể.

Có móc nào tốt hơn có sẵn trong ELMAH mà tôi có thể sử dụng để tiêm không?

Trả lời

13

Vị trí Dịch vụ/Depdency điểm mở rộng tiêm trong ELMAH là ServiceCenter.Current tài sản mà bạn có thể cung cấp một đại biểu với các chữ ký sau:

public delegate IServiceProvider ServiceProviderQueryHandler(object context); 

ELMAH sẽ sử dụng System.IServiceProvider trả về bởi các ServiceCenter.Current để giải quyết ErrorLog isntances .

Vì vậy, bạn cần thực hiện 3 điều cần thiết lập nó với Ninject (hoặc bất kỳ container DI)

  1. Tạo System.IServiceProvider thực hiện của riêng bạn với Ninject giao diện IKernel đã xuất phát từ từ System.IServiceProvider, vì vậy nó được thực hiện.
  2. Bạn cần đăng ký EntityFrameworkElmahErrorLog trong vùng chứa của mình để thực hiện ErrorLog vì ELMAH sẽ cố gắng giải quyết một phiên bản ErrorLog.
  3. Cung cấp đại biểu của bạn để ServiceCenter.Current

Vì vậy, bạn cần một cái gì đó như sau trong RegisterServices phương pháp của bạn:

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<ErrorLog>().To<EntityFrameworkElmahErrorLog>(); 
    ServiceCenter.Current = (httpContext) => kernel; 
} 

Lưu ý: trong trong ServiceProviderQueryHandler đại biểu bạn sẽ có được hiện tại HttpContext và với điều đó bạn có thể tinh chỉnh cách xử lý của bạn được giải quyết.

Bạn cũng nên lưu ý rằng với cách tiếp cận này, bạn sẽ mất khả năng định cấu hình ErrorLog trong tệp cấu hình của mình.

ELMAH sẽ luôn sử dụng cá thể đã giải quyết từ vùng chứa của bạn, vì được xây dựng trong ServiceContainer đọc tệp cấu hình bạn ghi đè bằng logic tùy chỉnh của bạn.

+0

Hoàn hảo, cảm ơn! –

Các vấn đề liên quan