如何使用.NET Core Configuration框架将连接字符串放置到json配置文件中?

时间:2017-09-27 06:39:25

标签: c# entity-framework asp.net-core .net-core .net-standard-1.4

我的解决方案有3个项目:

  • 实体(包括Dbcontext,...),目标框架.NetStandard 1.4,项目类型库
  • 的WebAPI
  • WebUI中

我想创建函数迁移到Entity Project。 在Entity项目中,我有一个类TemporaryDbContextFactory

public class TemporaryDbContextFactory : IDbContextFactory<MyContext>
    {


        public ApplicationContext Create(DbContextFactoryOptions options)
        {
            var builder = new DbContextOptionsBuilder<MyContext>();
            builder.UseSqlServer("Server=(local)\\mssqllocaldb;Database=mydatabase;Trusted_Connection=True;MultipleActiveResultSets=true;User ID=sa; Password=123456",
                optionsBuilder => optionsBuilder.MigrationsAssembly(typeof(MyContext).GetTypeInfo().Assembly.GetName().Name));
            return new MyContext(builder.Options);
        }
    }

但在这里我不想使用硬编码连接字符串我试图为动态连接字符串创建appsetting:

public class MyContextFactory : IDbContextFactory<ApplicationContext>
    {
        public MyContext Create()
        {
            var environmentName =
                        Environment.GetEnvironmentVariable(
                            "Hosting:Environment");

            var basePath = AppContext.BaseDirectory;

            return Create(basePath, environmentName);
        }

        public MyContext Create(DbContextFactoryOptions options)
        {
            return Create(
                options.ContentRootPath,
                options.EnvironmentName);
        }

        private MyContext Create(string basePath, string environmentName)
        {
            var configuration = new Configuration();
            configuration.AddJsonFile(“config.json”);
            var emailAddress = configuration.Get("emailAddress");

            var builder = new ConfigurationBuilder()
                .SetBasePath(basePath)
                .AddJsonFile("appsettings.json")
                .AddJsonFile($"appsettings.{environmentName}.json", true)
                .AddEnvironmentVariables();


            var config = builder.Build();

            var connstr = config.GetConnectionString("(default)");

            if (String.IsNullOrWhiteSpace(connstr) == true)
            {
                throw new InvalidOperationException(
                    "Could not find a connection string named '(default)'.");
            }
            else
            {
                return Create(connstr);
            }
        }

        private MyContext Create(string connectionString)
        {
            if (string.IsNullOrEmpty(connectionString))
                throw new ArgumentException(
                    $"{nameof(connectionString)} is null or empty.",
                    nameof(connectionString));

            var optionsBuilder =
                new DbContextOptionsBuilder<MyContext>();

            optionsBuilder.UseSqlServer(connectionString);

            return new MyContext(optionsBuilder.Options);
        }
    }

我坚持创建一个这个

的实例
var configuration = new Configuration();

实体项目没有对Microsoft.Extensions.Configuration的任何引用 我不知道如何添加这个因为我找不到它。请帮我添加此参考或建议我采用不同的方式

1 个答案:

答案 0 :(得分:2)

这是一个新的配置框架,在你习惯之后你会喜欢它:

var configuration = new ConfigurationBuilder()
   .AddJsonFile("config.json")
   .Build();
var emailAddress = configuration.GetValue<string>("emailAddress");

您需要安装以下nuget包: Microsoft.Extensions.Configuration.Json Microsoft.Extensions.Configuration.ConfigurationBinder

如果您没有看到,请务必使用正确的Feed。查看软件包管理器的Package Source组合框,它应该是nuget.org

此外,请确保将config.json配置文件复制到输出:

{
   "emailAddress" : "some@example.com"
}

具体关于连接字符串,请查看此示例:https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-strings#aspnet-core