WebAPI Core 2具有相同上下文的多个连接字符串

时间:2017-11-30 16:50:18

标签: c# asp.net-web-api

我正在开发具有Core 2.0知识的webapi 我需要创建两个链接以从不同的数据库生成不同的结果,两个数据库模式都是相同的。

https://localhost:5000/m/University
https://localhost:5000/v/University
它们都使用相同的webapi应用程序在不同的数据库中激活并给出结果。我可以生成结果,但我必须在启动类中创建两个webapi项目或更改连接字符串(" MConn")。

  public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<IISOptions>(options => { options.AutomaticAuthentication = true; });
        services.AddDbContext<PIDBContext>(opt => opt.UseSqlServer(Configuration.GetConnectionString("MConn")));
        services.AddMvc();
    }

你能帮我看看如何根据Https请求使用不同连接字符串的同一个Webapi项目吗?

由于

2 个答案:

答案 0 :(得分:2)

找到解决方案:

  1. 创建DbContextFactory

    public static class DbContextFactory
    {
        public static Dictionary<string, string> ConnectionStrings { get; set; }
    
        public static void SetConnectionString(Dictionary<string, string> connStrs)
        {
            ConnectionStrings = connStrs;
        }
    
        public static AppContext Create(string connid)
        {
            if (!string.IsNullOrEmpty(connid))
            {
                var connStr = ConnectionStrings[connid];
                var optionsBuilder = new DbContextOptionsBuilder<AppContext >();
                optionsBuilder.UseSqlServer(connStr);
                var db = new AppContext (optionsBuilder.Options);
                return db;
            }
            else
            {
                throw new ArgumentNullException("Connection failed becuase of no Connection ID");
            }
       } 
    }
    
  2. Project Json文件:

    {
        "ConnectionStrings": {
        "Sample1con": "your 1st connection string",
        "Sample2con": "your 2nd connection string"
        }
    }
    
  3. 在Startup类中的Configure方法声明Dictionary

    Dictionary<string, string> connStrs = new Dictionary<string, string>();
    connStrs.Add("p", Configuration.GetConnectionString("Sample1con"));
    connStrs.Add("m", Configuration.GetConnectionString("Sample2con"));
    DbContextFactory.SetConnectionString(connStrs);
    
  4. 在行动中使用

    var _context = DbContextFactory.Create(db); ///Db would be your URL string.
    

答案 1 :(得分:1)

你必须有两个链接吗?如果没有,你不能通过以下方式实现这一目标。

  • 将参数传递给您的路线,并使用该路线决定使用哪种上下文。
  • 因此,对于https://localhost:5000/University/m,您将使用一个上下文,对于https://localhost:5000/University/v,您将使用另一个上下文。
  • 由于两个数据库都具有相同的模式,因此将结果解析为相同的对象模型不会有任何问题。