2016-08-05 1 views
0

Вы не можете использовать относительную строку соединения с SQLite на EF7, поэтому мне нужен способ получить каталог приложений из Startup.cs во время процедуры ConfigureServices, где DBContext .Получить каталог приложений из метода Configure в Startup.Cs

Любая идея, как это сделать с библиотеками .NetCoreApp?

public void ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddMvc(); 

     //Figure out app directory here and replace token in connection string with app directory.......  

     var connectionString = Configuration["SqliteConnectionString"]; 

     if (string.IsNullOrEmpty(connectionString)) 
      throw new Exception("appSettings.json is missing the SqliteConnectionString entry."); 
     services.AddDbContext<MyContext>(options => 
     { 
      options.UseSqlite(connectionString, b => b.MigrationsAssembly("xyz.myproject.webapp")); 

     }); 
    } 

ответ

4

вы можете копить окружающую среду в местной собственности, а затем вы можете получить доступ к нему, чтобы получить базовый путь:

public Startup(IHostingEnvironment env) 
{ 
    var builder = new ConfigurationBuilder() 
     .SetBasePath(env.ContentRootPath) 
     .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
     .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); 


    Configuration = builder.Build(); 

    environment = env; 
} 

public IHostingEnvironment environment { get; set; } 
public IConfigurationRoot Configuration { get; } 

public void ConfigureServices(IServiceCollection services) 
{ 
    // you can access environment.ContentRootPath here 
} 
+0

прекрасно работает, и я предпочитаю этот метод. Я полностью пропустил объект IHostingEnvironment в конструкторе. Спасибо что подметил это. –

+0

Я не понимаю, как это работает, ConfigureServices() запускается до Startup(), поэтому переменная среды всегда будет пуста при доступе из ConfigureServices? –

+0

no Конструктор Startup должен быть вызван первым, запуск не является статическим классом, ConfigureServices не может быть вызван перед вызовом конструктора, чтобы создать экземпляр Startup, поскольку это метод экземпляра, а не статический метод. Это немного изменилось в 2.0 шаблонах проектов, так как теперь IConfiguration создается в программе и передается в конструктор Startup, хотя старый синтаксис все еще работает. –

1

Вы можете получить базовое приложение каталога, используя следующим:

AppContext.BaseDirectory; 
0

Просто используйте инъекцию зависимости, где вам нужно получить путь.

Пример

ValueController(..., IHostingEnvironment env) 
{ 
Console.WriteLine(env.ContentRootPath); 
... 
} 
Смежные вопросы