C# .Net Core和EntityFrameworkCore

C# .Net Core和EntityFrameworkCore,c#,.net-core,entity-framework-core,unit-of-work,C#,.net Core,Entity Framework Core,Unit Of Work,我正在努力学习.NETCore 我有两个项目: .Net核心Web api项目 NetCore项目包含我的工作单元(实体框架) 我的问题是: 如何从appsettings.json传递连接字符串 到我的DLL 我有startup.cs配置,但我不知道如何使用它访问我的appsettings.json public Startup(IConfiguration configuration) { Configuration = configuration; } startup.cs中有se

我正在努力学习.NETCore

我有两个项目:

  • .Net核心Web api项目
  • NetCore项目包含我的工作单元(实体框架)
  • 我的问题是:

  • 如何从appsettings.json传递连接字符串 到我的DLL

    我有startup.cs配置,但我不知道如何使用它访问我的appsettings.json

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
    
    startup.cs中有services.AddDbContext

    但我不想使用services.AddDbContext,因为它是实体框架的一对,如果我必须更改为其他ORM,我必须更改 这段代码也是

  • 另一个问题是,您如何负责解密连接 绳子

    • 答:webapi必须解密到连接字符串并传递到DLL (工作单位)

    • 或者工作单元必须解密连接字符串

  • 如果我有另一个项目(即桌面应用程序),如何 使用DLL(工作单元)我是否也必须建立连接 桌面应用程序的my appsettings中的字符串?(好像 有点重复?)


  • 您可以这样做:

    public BooksContext(string connectionString): this(GetOptions(connectionString))
    { }
    
    private static DbContextOptions GetOptions(string connectionString)
    {
        return SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), connectionString).Options;
    }
    

    您可以这样做:

    public BooksContext(string connectionString): this(GetOptions(connectionString))
    { }
    
    private static DbContextOptions GetOptions(string connectionString)
    {
        return SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), connectionString).Options;
    }
    
    我不想使用services.AddDbContext,因为它是一对实体框架

    因此,您需要做的是在EF项目中创建一个扩展方法来包装此调用,以便对EF的依赖关系保持在EF项目中,如下所示:

    public static IServiceCollection AddDatabase<TContext>( this IServiceCollection serviceCollection, Action<DbContextOptionsBuilder> optionsAction, string connectionString)
    {
        options.UseSqlServer(connectionString))
    }
    
    这将解决您的依赖性问题

    关于第2条:参见此处:

    关于3:那么其他项目将需要调用
    AddDatabase
    方法并传入连接字符串,因此EF项目将永远不知道从何处获取它,它总是提供的

    我不想使用services.AddDbContext,因为它是一对实体框架

    因此,您需要做的是在EF项目中创建一个扩展方法来包装此调用,以便对EF的依赖关系保持在EF项目中,如下所示:

    public static IServiceCollection AddDatabase<TContext>( this IServiceCollection serviceCollection, Action<DbContextOptionsBuilder> optionsAction, string connectionString)
    {
        options.UseSqlServer(connectionString))
    }
    
    这将解决您的依赖性问题

    关于第2条:参见此处:


    关于3:那么其他项目将需要调用
    AddDatabase
    方法并传入连接字符串,因此EF项目将永远不知道从何处获取它,它总是提供的。

    您可以像这样获取in Stratup.cs文件

    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    
    
    private readonly IConfigurationRoot _appConfiguration;
    private readonly IHostingEnvironment _hostingEnvironment;
    
    public Startup(IHostingEnvironment env)
    {
        _hostingEnvironment = env;
        _appConfiguration = env.GetAppConfiguration();
    }
    
    获取连接字符串的代码:

    string connectionString = _appConfiguration["ConnectionStrings:Default"];
    
    appsettings.json

    {
      "ConnectionStrings": {
        "Default": "Server=YourDBAddress; Database=YourDB; Trusted_Connection=True;"
      }
      ...
    }
    

    关于其他方面,您可以参考@Jamie Rees的答案。

    您可以在Stratup.cs文件中获得如下内容

    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    
    
    private readonly IConfigurationRoot _appConfiguration;
    private readonly IHostingEnvironment _hostingEnvironment;
    
    public Startup(IHostingEnvironment env)
    {
        _hostingEnvironment = env;
        _appConfiguration = env.GetAppConfiguration();
    }
    
    获取连接字符串的代码:

    string connectionString = _appConfiguration["ConnectionStrings:Default"];
    
    appsettings.json

    {
      "ConnectionStrings": {
        "Default": "Server=YourDBAddress; Database=YourDB; Trusted_Connection=True;"
      }
      ...
    }
    

    关于其他问题,您可以参考@Jamie Rees的答案。

    有什么更新吗?有什么更新吗?