2017-09-15 93 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; 
} 

}