Windows服务中的EF Core和DI

时间:2017-09-15 12:19:50

标签: c# entity-framework dependency-injection asp.net-core

我试图在我的Windows服务应用程序中使用EF Core 2.0(目标.NET Framework 4.6.2)。为了让事情变得有趣,我不想像这样创建实例

DbContext ctx = new DbContext(connectionString)

我希望将它与依赖注入一起使用(StructureMap 4.5.2)。

我有一个IDbContext,我的DbContext看起来像:

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

我和#34;奇怪的原因" ctor是我不知道在Windows服务中配置EF Core的位置或方式。我在哪里或如何告诉Windows服务在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 Core MVC应用程序中执行此类似的操作:

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

其中服务是IServiceCollection实例。

有人可以指出我正确的方向如何以最佳方式做到这一点?

1 个答案:

答案 0 :(得分: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;
}

}