2015-05-12 21 views
20

Tôi có ứng dụng ASP.NET MVC 6 (beta-4).Cách đăng ký ILogger để tiêm trong ASP.NET MVC 6

public void ConfigureServices(IServiceCollection services) 
{ 
    // Logging 
    services.AddLogging(); 

    // ... 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory) 
{ 
    // Add the console logger. 
    loggerfactory.AddConsole(minLevel: LogLevel.Warning); 

    // ... 
} 

Và tôi có một bộ điều khiển ...

public class HomeController : 
    Controller 
{ 
    ILogger _logger; 

    public HomeController(ILogger logger) 
    { 
     _logger = logger; 
    } 

    // ... 
} 

Nhưng khi tôi không nhận được dịch vụ đăng ký một cách chính xác bằng cách nào đó: InvalidOperationException: Unable to resolve service for type 'Microsoft.Framework.Logging.ILogger' while attempting to activate 'HomeController'.. Tôi đang làm gì sai khi đăng ký logger?

+0

Bạn chưa đăng ký 'ILogger'. – Steven

+0

Đó không phải là 'service.AddLogging()' có phải không? Tôi có thể đã thực hiện một giả định lớn với điều đó, thời gian để đi lặn nguồn. – Travis

+0

Vì vậy, 'AddLogging()' nên đăng ký 'ILogger <>'. Có lẽ tôi cần phải tiêm 'ILogger ' thay vì 'ILogger'. – Travis

Trả lời

50

Tôi giả định rằng services.AddLogging(); đang làm đúng và đăng ký ILogger. Sau khi nhìn vào nguồn (https://github.com/aspnet/Logging/blob/d874c5726e713d3eb34938f85faf7be61aae0f2a/src/Microsoft.Framework.Logging/LoggingServiceCollectionExtensions.cs) Tôi thấy rằng nó thực sự đăng ký ILogger<>. Thay đổi chữ ký của ILogger thành ILogger<HomeController> làm cho ví dụ trên hoạt động.

public class HomeController : 
    Controller 
{ 
    ILogger<HomeController> _logger; 

    public HomeController(ILogger<HomeController> logger) 
    { 
     _logger = logger; 
    } 

    // ... 
} 

Nhờ @Steve đã giúp tôi đi đúng hướng để tìm ra điều này.

+0

Tính năng này hoạt động. Tôi đọc họ sẽ thay đổi RC2 để có trả về bất cứ điều gì T là (như ) để bạn có thể thực sự nhận được thực hiện của bạn và không chỉ là phương pháp giao diện. Hiện tại, bạn có thể đặt bất cứ thứ gì vào đó và nó hoạt động, có vẻ như nó bỏ qua nó. Tôi đã thử nghiệm ILogger chỉ để kiểm tra lý thuyết đó và nó đã hoạt động. –

+1

Những gì T thực sự được sử dụng cho, là bối cảnh khai thác gỗ. - bạn gọi ILogger trong đó T thường là kiểu gọi. Nhưng có thể thực sự là bất kỳ thứ gì. – VisualBean

+0

Bạn cũng có thể chỉ định ILoggerFactory như mô tả ở đây https://docs.asp.net/en/latest/fundamentals/logging.html – stankovski

0

Các services.AddLogging(); không làm việc cho tôi, vì vậy tôi bổ sung thêm hai báo cáo này để ConfigureServices:

services.AddSingleton<ILoggerFactory, LoggerFactory>(); 
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); 

Bây giờ container DI là hạnh phúc và mọi thứ hoạt động.

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