我应该使用模型类来创建SqlConnection对象吗?

时间:2017-06-08 10:22:39

标签: sql asp.net-mvc

我正在使用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
    }

困扰我的另一件事是在一个类中打开连接并在另一个类中关闭它。 我还没有在任何地方看到这个,所以我觉得我做得不对,你觉得怎么样?

1 个答案:

答案 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();
    }
}

理想情况下,您可以将服务和数据层放在单独的项目中。

希望这是有道理的。