2015-10-27 4 views
0

Я пытаюсь создать новый проект ASP.Net MV5 (в настоящее время beta8) для цели обучения.Не удается получить AppSettings в asp.net mvc 6 beta 8

У меня застрял простой случай получения настроек приложения.

Я добавил некоторые конфигурации в файле appsettings.json:

{ 
    "Data": { 
    "DefaultConnection": { 
     "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=aspnet5-someproject-e84e86e2-0fec-4132-9a91-2f6c4b4c61a3;Trusted_Connection=True;MultipleActiveResultSets=true" 
    } 
    }, 
    "AppSettings": { 
    "CloudStorageContainerReference": "someproject", 
    "StorageConnectionString": "UseDevelopmentStorage=true" 
    } 
} 

Я также создал строго типизированный класс:

public class AppSettings 
{ 
    public string CloudStorageContainerReference { get; set; } 
    public string StorageConnectionString { get; set; } 
} 

И обновил свой файл запуска:

public void ConfigureServices(IServiceCollection services) 
    { 
     // Add Entity Framework services to the services container. 
     services.AddEntityFramework() 
      .AddSqlServer() 
      .AddDbContext<ApplicationDbContext>(options => 
       options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])); 

     // Add Identity services to the services container. 
     services.AddIdentity<ApplicationUser, IdentityRole>() 
      .AddEntityFrameworkStores<ApplicationDbContext>() 
      .AddDefaultTokenProviders(); 

     // Add settings 
     services.Configure<AppSettings>(Configuration.GetSection("AppSettings")); 

     // Add MVC services to the services container. 
     services.AddMvc(); 

     // Register application services. 
     services.AddTransient<IEmailSender, AuthMessageSender>(); 
     services.AddTransient<ISmsSender, AuthMessageSender>(); 
    } 

На этом этапе, если я нарушу код, я вижу, что Configuration.GetSection("AppSettings").Value имеет значение null.

Кроме того, я хочу, чтобы ввести эти параметры в своих контроллерах:

public class TransfertController : Controller 
{ 
    private IOptions<AppSettings> AppSettings; 

    public TransfertController(IOptions<AppSettings> appSettings) 
    { 
     if (AppSettings == null) throw new ArgumentNullException(nameof(appSettings)); 

     AppSettings = appSettings; 
    } 

} 

Но бросить NullReferenceException как мой параметр appSettings равно нулю.

Что не хватает?

[Редактировать]: как примечание стороны, эта линия:

Configuration["AppSettings:CloudStorageContainerReference"] 

Возвращает фактически правильное одно значение.

ответ

0

Я бы сказал, что это просто опечатка в исходном коде:

public TransfertController(IOptions<AppSettings> appSettings) 
{ 
    if (AppSettings == null) throw new ArgumentNullException(nameof(settings)); 

    AppSettings = appSettings; 
} 

в настороже, вы проверяете то же свойство AppSettings, что вы назначаете, прежде чем присваивать его. Вы хотите, чтобы охранник проверял входной параметр метода, а не ваше имущество, как в if (appSettings == null) throw new ... (обратите внимание на нижний регистр appSettings)

+0

Hawk eye ... thanks –

0

Не уверен, чтобы понять, почему, но я решил эту проблему путем переименования моего члена класса «AppSettings» в «Настройки», и разворачивания IOptions:

public class TransfertController : Controller 
{ 
    private readonly AppSettings Settings; 

    public TransfertController(IOptions<AppSettings> settings) 
    { 
     if (settings == null) throw new ArgumentNullException(nameof(settings)); 

     Settings = settings.Value; 
    } 
} 

сейчас работает ...