2

我的 ASP.Net MVC 应用程序必须在运行时连接到多个数据库。我可以重载我的类以在运行时接受连接字符串,如下所示

class MyClassDBContext:DbContext
{
  public MyClassDBContext(string str) : base(str)
  {
    this.Database.Connection.ConnectionString = str;
  }
}

目前,我正在从数据库表中检索此连接字符串。我的工作流程如下

  1. 网站使用存储在 web.config 中的凭据连接到默认数据库
  2. 网站查询默认数据库以获取其他数据库的连接字符串。
  3. 网站通过在运行时提供连接字符串连接到其他数据库

我现在面临的问题是保持我的代码干净。每次我需要数据库 2 的连接字符串时,我都必须在默认数据库中查找它。有没有更清洁的方法来做到这一点?我考虑将连接字符串存储在配置文件数据中,但我不确定这是否是个好主意。我网站的每个用户最多需要连接到 2-3 个不同的数据库,具体取决于他们的凭据。

4

2 回答 2

2

我会亲自将所有连接字符串放在您的 App.Config 文件中并使用简单的 IOC 实现。

实际上,Nuget 的 ninject 包可能非常适合您的需求。

这就是我的意思。希望这使您的代码干净。我在以前的项目中使用了完全相同的模式,并且效果很好。

您可以更进一步,在您的 global.asax 中创建一个服务定位器并注册服务。如果您对此感兴趣,请告诉我。另请查看ninject。

public interface IService() 
{ 
  string GetConnectionString(); 
  void DoStuff(); 
}

public class DBServiceOne : DbContext, IService
{
  protected string GetConnectionString() 
  {
    return ConfigurationManager.AppSettings["DBServiceOneConnectionString"]
  }

  public DBServiceOne(string str) : base(str)
  {
     this.Database.Connection.ConnectionString = GetConnectionString()
  }

   public void DoStuff() { //logic goes here }
}

public class DBServiceTwo : DbContext, IService
{

    public DBServiceTwo(string str) : base(str)
    {
      this.Database.Connection.ConnectionString = GetConnectionString();
    }


    protected string GetConnectionString() 
    {
      return ConfigurationManager.AppSettings["DBServiceTwoConnectionString"]
    }

    public void DoStuff() { //logic goes here }
}

public class DBServiceThree : DbContext, IService
{

   public DBServiceThree(string str) : base(str)
   {
     this.Database.Connection.ConnectionString = GetConnectionString();
   }

   protected string GetConnectionString() 
   {
     return ConfigurationManager.AppSettings["DBServiceThreeConnectionString"]
   }

   public void DoStuff() { //logic goes here }
}

现在实现——在你的控制器上使用构造函数注入

//This could be in your home controller

public class HomeController : AsyncController
{
    private IService DBOneService;
    private IService DBTwoService;
    private IService DBThreeService;

   public HomeController(IService one, IService two, IService three)
   {
      DBOneService= one;
      DBTwoService = two;
      DBThreeService = three;
   }

  public HomeController() : this(new DBServiceOne(), new DBServiceTwo(), new DBServiceThree()) {}

public ActionResult Index() {
   DBOneService.DoStuff(); //here you'd want to return a list of data and serialize down with json or populate your razor template with it. Hope this helps!

}
于 2012-07-23T19:04:43.500 回答
0

我有一个稍微不同的问题。我连接的数据库取决于产品导入的状态。在导入期间,数据库会被附加和分离。当前可用的数据库存储在“默认数据库”中。

我遇到的主要问题是我必须关闭连接池,否则在分离数据库并再次附加它们之后存在无效的连接状态。

这对您来说可能不是问题。

除此之外,我将当前的 Connectionstring 存储在应用程序状态中。仅在每 60 秒后,我才再次查询“默认数据库”。您必须通过使用锁定来注意多线程问题。

于 2012-07-23T19:58:43.253 回答