2016-05-15 68 views
0

與ASP.Net MVC 5玩弄。看到這個問題跳過,但沒有一個完整的答案。我想要做的是有一個輔助類,它可以訪問AppSettings。我可以在控制器和視圖中訪問它,但還沒有想出如何在我自己的自定義類上訪問它。啓動配置如此。應用程序設置的自定義類ASP.Net MVC 5 6

public Startup(IHostingEnvironment env) 
    { 
     // Set up configuration sources. 

     var builder = new ConfigurationBuilder() 
      .AddJsonFile("config.json") 
      .AddJsonFile($"config.{env.EnvironmentName}.json", optional: true); 

     builder.AddEnvironmentVariables(); 
     Configuration = builder.Build(); 
    } 

    public IConfigurationRoot Configuration { get; set; } 

    // This method gets called by the runtime. Use this method to add services to the container. 
    // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940 
    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddMvc(); 
     services.AddOptions(); 
     services.Configure<AppSettings>(Configuration.GetSection("AppSettings")); 
    } 
................. 
................. 

回答

1

爲了訪問您的AppSettings屬性的自定義類,使配置一個靜態實例如:

public static IConfigurationRoot Configuration { get; set; } 

並在應用程序中使用您的AppSettings的任何(對於ConnectionString的例子)如下:

var connectionString = Startup.Configuration["Data:DefaultConnection:ConnectionString"]; 
0

如果您在自己的類中需要它,可能是將它傳遞給該類的構造函數或作爲參數。例如;

public class Notifications 
{ 
    public Notifications(AppSettings settings) { 
     this.settings = settings; 
    } 

    public void SendEmail(string subject, string body) { 
     SmptClient.Send(subject, body, settings["email address"]); 
    } 
} 

因此,通常情況下,您可以通過控制器傳遞它。

這避免了全局變量,這始終是一件好事,我想。

在config.json文件
2

因此,假設你有以下設置

{ 
    "smtp": { 
     "SenderEmail": "[email protected]", 
     "SenderFrom": "Test User" 
    } 
} 

然後在您的ConfigureServices方法,你需要做這樣的事情

services.Configure<SmtpEmailSetting>(Configuration.GetSection("smtp"));

這是你的長相SmtpEmailSetting像

public class SmtpEmailSetting 
{ 
    public string SenderEmail { get; set; } 
    public string SenderFrom { get; set; } 
} 

,這是你如何訪問設置在

public class SendEmailService 
{ 
    private readonly SmtpEmailSetting _smtpEmailSetting; 

    public SendEmailService(IOptions<SmtpEmailSetting> smtpOptions) 
    { 
     _smtpEmailSetting = smtpOptions.Value; 
    } 

    public void SendEmail() 
    { 
     var fromEmail = _smtpEmailSetting.SenderEmail; 
     var displayName = _smtpEmailSetting.SenderFrom; 
    } 
} 

所以基本上你用你的設置或選項(不管你喜歡叫它)任何服務或控制器應在構造函數中使用IOptions<>類的泛型類型參數。希望它可以幫助

0

只需添加到adeel41的答案,這是正確的偉大工程,爲自己,我不想使用依賴注入時,圍繞-i選項對象拖動。

所以我更喜歡做這樣的事情

services.AddSingleton<ISmtpEmailSettings>(Configuration.GetSection("SmtpSettings").Get<SmtpEmailSettings>()); 

最重要的是加入到GetSection到您的JSON反序列化對象獲取語法。

0

在RC1的時候,我把靈感來自於this post裏克施特拉爾,這真是棒極了。這與已經提出的其他方法非常相似。

這個問題只是我的發現爲RTM版本的更新。看起來好像Configuration.GetSection(string topLevelKey)不再工作,至少對我來說它總是返回null(即使配置源設置正確)。

一些搜索後,this other SO thread我指出了正確的方向,通過使用:

// create empty config object 
var smtpEmailSetting = new SmtpEmailSetting(); 

// fill it from configuration section 
Configuration.GetSection("smtp").Bind(smtpEmailSetting); 

// use it, e.g. by registering it into DI 
services.Configure<SmtpEmailSetting>(smtpEmailSetting); 

HTH

相關問題