刚开始使用 .Net Core 并面临将连接字符串信息传递给 Context 控制台项目的问题。

我有 4 个项目,使用 .Net Core 创建。

  • MVC
  • 服务层
  • 域层
  • 数据层

  • 在 MVC 项目中,我有 Startup.cs 文件,我正在读取 appsettings.json 文件
        public void ConfigureServices(IServiceCollection services)
            {
                // Add framework services.
                services.AddApplicationInsightsTelemetry(Configuration);
    
                services.AddMvc();
    
                // Add appsettings
                services.Configure<AppSettingsConfig>(Configuration.GetSection("AppSettings"));
    }
    
    
    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)
                .AddEnvironmentVariables();
    
            if (env.IsDevelopment())
            {
                // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
                builder.AddApplicationInsightsSettings(developerMode: true);
            }
            Configuration = builder.Build();
        }
    

    在我的第四个项目(数据层)中,Console Project 并具有以下 DBContext 类。这个项目不像我的 MVC 项目那样有 Startup.cs。 VS 2015 默认不创建。
    public class MyDWContext : DbContext
    {
        public MyDWContext() : base ()
        {
    
        }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
    
        }
    
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Data Source=localhost;Initial Catalog=MyDW; Persist Security Info = False; User ID = TempUser; Password = Temp123");
        }
    
        public DbSet<User> Users { get; set; }
        public DbSet<Class> Classs { get; set; }
    }
    

    我也去过其他帖子,但我相信它是使用旧版本或 RC 版本创建的。所以有一段时间我找不到正确的对象或 .Net 类。

    由于我在 MVC 项目中有连接字符串,我如何在 MVC 调用数据层期间使用连接字符串。

    我也有 Web.API(核心)项目,并且有自己的连接字符串(连接字符串中的不同用户配置,只有读取访问权限)。当我从 Web2.API 项目进行调用时,如何使用 Web2.API 连接字符串。

    最佳答案

    不是将连接字符串传递给 DbContext ,在 DbContext 中配置 Startup.cs (如果可能)是更好的方法。请参阅官方 docs 以了解如何配置 DbContext 并通过依赖注入(inject)使用它。

    编辑:下面的代码不是好方法

    但是,如果您想将连接字符串传递给 DbContext,您可以使用 options pattern

    以下是如何使用选项模式传递连接字符串的示例:

    首先,您需要一个可从数据层和 MVC 层访问的选项类

    public class ConnectionStringOption
    {
         public string ConStr { get ; set; }
    }
    

    然后设置选项值
    public void ConfigureServices(IServiceCollection services)
    {
         services.AddOptions();
         services.Configure<ConnectionStringOption>(options=>
         {
             // set connection string from configuration
             options.ConStr = Configuration.GetConnectionString("Default");
         });
    }
    
    appsetting.json
    {
      "ConnectionStrings": {
        "Default": "<your connection string>"
      }
    }
    

    最后 DbContext
        private readonly IOptions<ConnectionStringOption> _conStrOptions;
    
        protected YourDbContext()
        {
        }
        public YourDbContext(IOptions<ConnectionStringOption> conStrOptions, DbContextOptions options)
            : base(options)
        {
            _conStrOptions= conStrOptions;
        }
    

    以另一种方式编辑

    使用静态服务定位器可能是一个解决方案:

    在数据层创建一个 DependencyResolver
    public static class DependencyResolver
    {
        private static IServiceProvider _provider;
        public static IServiceProvider ServiceProvider
        {
            get
            {
                return _provider;
            }
            set
            {
                if(_provider == null)
                {
                    _provider = value;
                }
            }
        }
    }
    

    ConfigureServices 方法中
        public void ConfigureServices(IServiceCollection services)
        {
            // other stuff
            services.AddOptions();
            services.Configure<ConnectionStringOption>(options=>
            {
                // set connection string from configuration
                options.ConStr = Configuration.GetConnectionString("Default");
            });
            DependencyResolver.ServiceProvider = services.BuildServiceProvider();
        }
    

    最后得到选项:
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var conStr = DependencyResolver.ServiceLocator.GetService<IOptions<ConnectionStringOption>>().Value.ConStr;
        optionsBuilder.UseSqlServer();
    }
    

    对之前愚蠢方式的最终编辑
    public static class ConnectionStringGetter
    {
        public static string ConStr{get;set;}
    }
    
    public Startup(IHostingEnvironment env)
    {
        //...
        Configuration = builder.Build();
        ConnectionStringGetter.ConStr =  Configuration.GetConnectionString("Default");
    }
    
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(ConnectionStringGetter.ConStr);
    }
    

    关于asp.net-core - .Net Core 将连接字符串传递给 DBContext 类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39090206/

    10-13 06:55