场景:本地IIS上的ASP.Net Web应用程序(n层linq2sql),通过VPN连接到SQL 2008数据库。某些数据将复制到本地SQL 2008 Express DB(不同的名称)。如果连接到VPN数据库,我们希望将本地实例用于Web应用程序的某些部分。
我的问题是,如何改进以下解决方案。我们涉及很多传递连接字符串。如果这涉及镜像,我们可以设置故障转移伙伴,但由于它是一个不同的数据库,我不认为这是可能的。
当前代码:
检查我们是否可以远程连接,将工作连接字符串放入会话
Session_Start()
{
//if can connect to remote db
Session["ConnStr"] = //remote connection
//else
Session["ConnStr"] = //local connection
}
将UI中的连接字符串传递给BLL
protected void ods1_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
{
TestManager myTestManager = new TestManager(Session["ConnString"].ToString());
e.ObjectInstance = myTestManager;
}
传递给DAL
public class TestManager
{
private readonly string _connectionString;
public TestManager(string connectionString)
{
_connectionString = connectionString;
}
[DataObjectMethod(DataObjectMethodType.Select, true)]
public List<Test> GetAll()
{
TestDB testDB = new TestDB(_connectionString);
return testDB.GetAll();
}
}
在DAL中设置连接,在构造函数
中创建DataContextpublic class TestDB
{
public TestDB(string connectionString)
{
_connectionString = connectionString;
_dbContext = new TestDataContext(_connectionString);
}
private TestDataContext _dbContext;
private string _connectionString;
public string ConnectionString
{
get
{
return _connectionString;
}
set
{
_connectionString = value;
}
}
public TestDataContext DbContext
{
get
{
return _dbContext;
}
set
{
_dbContext = value;
}
}
public List<Test> GetAll()
{
var query = from t in DbContext.Tests
select new DTO.Test()
{
Id = t.Id,
Name = t.Name
};
return query.ToList();
}