2017-09-15 111 views
0

我想在我的Windows服務應用程序(面向.NET Framework 4.6.2)使用EF核心2.0。爲了讓事情變得有趣,我不希望只是像這樣EF核心和在Windows服務的DI

DbContext ctx = new DbContext(connectionString) 

我想與依賴注入使用它創建實例(StructureMap 4.5.2)。

我有一個IDbContext和我的DbContext的樣子:

public DbContext(string connectionString): base(new DbContextOptionsBuilder().UseSqlServer(connectionString).Options) 
{} 

我之所以「奇怪」的男星是,我不知道在哪裏或如何配置EF核心的Windows服務。我在哪裏或如何告訴windows service在app.config中使用連接字符串。

我已經爲現在做的是,我告訴StructureMap注入的連接字符串,像這樣:

new Container(config => 
{ 
    // Register stuff in container, using the StructureMap APIs... 
    config.Scan(_ => 
    { 
     _.TheCallingAssembly(); 
     _.WithDefaultConventions(); 
     _.LookForRegistries(); 
     }); 

     config.For<IDbContext>().Use<DbContext>().Ctor<string>("connectionString").Is(_connectionString); 
}); 

有沒有辦法在.NET核心MVC應用程序做到這一點類似這樣的:

services.AddDbContext<DbContext>(options => 
      options.UseSqlServer(connectionString)); 

服務是IServiceCollection實例。

有人可以請指出我在正確的方向如何以最好的方式做到這一點?

回答

0

這裏是我如何做到這一點..

public class RepositoryData : DbContext { 

public RepositoryData(string appSettingsOrConnectionName = null) :base(GetConnectionString(appSettingsOrConnectionName ?? "connection")) 
{ 

} 

private static string GetConnectionString(string appSettingsOrConnectionName = null) 
{ 
     if (!string.IsNullOrEmpty(appSettingsOrConnectionName) && appSettingsOrConnectionName.Contains(";")) 
      return appSettingsOrConnectionName; 
     if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings[appSettingsOrConnectionName])) 
      return ConfigurationManager.ConnectionStrings[ConfigurationManager.AppSettings[appSettingsOrConnectionName]].ConnectionString; 
     else if (!string.IsNullOrEmpty(ConfigurationManager.ConnectionStrings[appSettingsOrConnectionName].ConnectionString)) 
      return ConfigurationManager.ConnectionStrings[appSettingsOrConnectionName].ConnectionString; 
     else if (!string.IsNullOrEmpty(ConfigurationManager.ConnectionStrings["test"].ConnectionString)) 
     { 
      appSettingsOrConnectionName = "test"; 
      return ConfigurationManager.ConnectionStrings[appSettingsOrConnectionName].ConnectionString; 

     } 
     else return _defaultConnString; 
} 

}