我正在使用Active Directory和SQL Server 2008创建一个Intranet网站。我创建了一个ASP.NET MVC项目,我正在尝试建立与SQL数据库的连接,并且由于我公司有不同的数据库服务器,我可以创建一个创建连接字符串的Model类。
我的问题是:这是一种弊端吗?我知道关注点的分离,所以我在这里尝试这样做是为了有一个更好的组织和更清晰的代码,但我也觉得这对于小功能而言太过分了。
让我通过一个例子演示,这是一个用于在Model类SQLManager.cs中创建连接字符串的函数:
SqlConnection connectWeb= new SqlConnection();//This would be in a constructor
public SqlConnection CreateWebConnection(string SQLServerWeb, string SQLWebDB)
{
try
{
connectWeb.ConnectionString = "Data Source=" + SQLServerWeb + ";Initial Catalog=" + SQLWebDB
+ ";Integrated Security=SSPI";
connectWeb.Open();
return connectWeb;
}catch(Exception e)
{
Console.WriteLine("Exception levée : \n\n" + e.ToString());
}
return null;
}
使用此功能并在需要更改连接字符串时更改参数可能很实用。例如,我将使用以下控制器操作方法:
public ActionResult RoleBasedMenu()
{
SQLManager sqlManager = new SQLManager();
using(SqlConnection conn = sqlManager.CreateWebConnection("MyDataSource", "MyInitialCatalog"))
{
//SQL actions / queries here
}
困扰我的另一件事是在一个类中打开连接并在另一个类中关闭它。 我还没有在任何地方看到这个,所以我觉得我做得不对,你觉得怎么样?
答案 0 :(得分:1)
您需要从控制器中分离出数据库连接。原则上我采用UI的方法 - >服务 - >数据层。然后,每个控制器操作都可以调用与正确的数据层对话的相应服务,而数据层又连接到任何服务器上的特定数据库。
我在下面做了一个例子,展示了如何实现这一目标。我使用了术语"角色"因为你的帖子有一个RoleBasedMenu动作。
public class RoleController
{
[HttpGet]
public ActionResult RoleBasedMenu()
{
var myViewModel = new RoleViewModel();
var myService = new RoleServiceLayer();
var myRoleDetails = myService.GetRoleDetails();
myViewModel.Details = myRoleDetails;
return View("RoleBasedMenu", myViewModel);
}
}
public class RoleViewModel
{
public RoleDomainObject Details { get; set; }
}
public class RoleDomainObject
{
public string Name { get; set; }
//Other Properties here.
}
public class RoleServiceLayer
{
public RoleDomainObject GetRoleDetails(int roleID)
{
var myRole = new RoleDomainObject();
var dataLayer = new RoleDataLayer();
var myRoleData = dataLayer.GetRoleDetails(roleID);
var myDataRow = myRoleData.Tables[0].Rows[0];
//Set role properties
return myRole;
}
}
public class RoleDataLayer
{
public DataSet GetRoleDetails(int customerID)
{
//Connect to DB
return new DataSet();
}
}
理想情况下,您可以将服务和数据层放在单独的项目中。
希望这是有道理的。