2015-06-09 27 views
9

Tôi đang cố gắng tìm hiểu ASP.NET 5. Tôi đang sử dụng nó trên Mac OS X. Tại thời điểm này, tôi có một tập tin config.json trông giống như sau:ASP.NET 5 (vNext) - Cấu hình

config.json

{ 
    "AppSettings": { 
     "Environment":"dev" 
    }, 

    "DbSettings": { 
     "AppConnectionString": "..." 
    }, 

    "EmailSettings": { 
     "EmailApiKey": "..."   
    }, 
} 

tôi cố gắng để tìm ra cách để tải những cài đặt vào một tập tin cấu hình trong Startup.cs. Hiện nay, tôi có một tập tin mà trông như thế này:

Configuration.cs

public class AppConfiguration 
{ 
    public AppSettings AppSettings { get; set; } 

    public DbSettings DbSettings { get; set; } 

    public EmailSettings EmailSettings { get; set; }   
} 

public class AppSettings 
{ 
    public string Environment { get; set; } 
} 

public class DbSettings 
{ 
    public string AppConnectionString { get; set; } 
} 

public class EmailSettings 
{ 
    public string MandrillApiKey { get; set; } 
} 

Sau đó, trong Startup.cs, tôi có như sau:

public IConfiguration Configuration { get; set; } 
public Startup(IHostingEnvironment environment) 
{ 
    var configuration = new Configuration().AddJsonFile("config.json"); 
    Configuration = configuration; 
} 

public void ConfigureServices(IServiceCollection services) 
{ 
    services.Configure<AppConfiguration>(Configuration); 
} 

Tuy nhiên, phương pháp này không hoạt động. Về cơ bản, nó giống như nó không biết cách ánh xạ giữa các lớp .json và Config. Làm thế nào để tôi làm điều này?

Tôi thực sự muốn ở lại với cách tiếp cận DI vì vậy tôi có thể kiểm tra ứng dụng của tôi hiệu quả hơn.

Cảm ơn bạn

+0

@KamranShahid Điều đó không giải quyết câu hỏi này. –

Trả lời

4

Trong lớp Startup bạn, trước tiên xác định nguồn cấu hình của bạn:

private readonly IConfiguration configuration; 

public Startup(IHostingEnvironment env) 
{ 
    configuration = new Configuration() 
     .AddJsonFile("config.json") 
     .AddJsonFile($"config.{env.EnvironmentName}.json", optional: true); 
} 

Các env.EnvironmentName là một cái gì đó giống như "development" hoặc "production". Giả sử nó là "development". Khung này sẽ cố gắng kéo các giá trị cấu hình từ config.development.json trước tiên. Nếu các giá trị được yêu cầu không có hoặc tệp config.development.json không tồn tại thì khung sẽ cố gắng lấy các giá trị từ config.json.

Configure config.json bạn phần như các dịch vụ như thế này:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.Configure<AppSettings>(configuration.GetSubKey("AppSettings")); 
    services.Configure<DbSettings>(configuration.GetSubKey("DbSettings")); 
    services.Configure<EmailSettings>(configuration.GetSubKey("EmailSettings")); 
} 

Calling Configure<T>(IConfiguration) trên IServiceCollection đăng ký kiểu IOptions<T> trong container dependency injection. Lưu ý rằng bạn không cần lớp học AppConfiguration của mình.

Sau đó, xác định phụ thuộc để được tiêm như thế này:

public class EmailController : Controller 
{ 
    private readonly IOptions<EmailSettings> emailSettings; 

    public EmailController (IOptions<EmailSettings> emailSettings) 
    { 
     this.emailSettings = emailSettings; 
    } 

    public IActionResult Index() 
    { 
     string apiKey = emailSettings.Options.EmailApiKey; 
     ... 
    } 
} 
+0

Đây là phương pháp tôi hiện có. Tuy nhiên, tôi muốn có một lớp bao bọc (tức là 'AppConfiguration') vì tôi dự định có nhiều phần hơn trong tệp cấu hình. Tôi không muốn phải tiêm một loạt các phụ thuộc mỗi lần. Trong một nỗ lực để giữ cho mã của tôi sạch sẽ và ngắn gọn, tôi muốn sử dụng một lớp trình bao bọc đơn ('AppConfiguration') để tôi chỉ cần tiêm một phụ thuộc duy nhất. –

+0

@ZachTempleton Vui lòng kiểm tra cập nhật. –

+0

Cách tiếp cận cập nhật không hoạt động đối với tôi. Thật kỳ lạ, tôi có thể thấy các giá trị thuộc tính trong intellisense. Tuy nhiên, sau đây xác nhận rằng DbSettings là null. '\t \t \t \t \t nếu (appConfiguration.Options.DbSettings == null) Console.WriteLine (" cấu hình db chưa được đặt "); else Console.WriteLine ("cấu hình ứng dụng db được đặt"); ' –

1

Bạn chỉ có thể truy cập giá trị của tài sản Environment cấu hình bằng cách sử dụng Configuration lớp như bất cứ nơi nào trong ứng dụng của bạn.

var environment = Configuration["AppSettings:Environment"]; 

Nhưng nếu bạn muốn nó để truy cập thông qua một tài sản của lớp học mà bạn có thể làm điều này

public class AppSettings 
{ 
public string Environment 
{ 
get 
{ 
    return new Configuration().Get("AppSettings:Environment").ToString(); 
} 
set; 
} 
} 

Note tôi đã không thiết lập giá trị của Environment trong setter vì giá trị này sẽ được ở config.json do đó không cần phải đặt giá trị này trong setter.

Để biết thêm chi tiết có một cái nhìn tại article này.

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