3层架构 - 在业务层中放置SQL查询是否合适?

3
我的asp.net项目基于三层架构。
(数据访问层)DAL - (类库)
    private static string connString ="";

    private static OracleConnection conn;

    public static OracleConnection OpenConn()
    {
        if (conn==null)
        {
            conn = new OracleConnection(connString);
        }
        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }

        return conn;
    }

    public static DataTable Select(string query)
    {
        DataTable dt = new DataTable();
        OracleDataAdapter da = new OracleDataAdapter(query, OpenConn());
        da.Fill(dt);
        return dt;
    }

    public static void Execute(string query)
    {
        OracleCommand cmd = new OracleCommand(query, OpenConn());
        cmd.ExecuteNonQuery();
    } 

我已将所有查询放在(Business Logic Layer) BLL类中(所有BLL类都在单独的类库项目中),例如EmployeeBLL。
public static class EmployeeBLL
{
    public static DataTable Employees()
    {
       DataTable dt = new DataTable();
        string q = string.Format("select * from employees");
        dt = OraDAL.Select(q);
        return dt;
    }

    public static DataTable AddEmployee(string name)
    {
        DataTable dt = new DataTable();
        string q = string.Format("INSERT INTO employees (ename) VALUES('{0}')", name);
        dt = OraDAL.Select(q);
        return dt;
    }
}

我看到了一些关于三层架构的博客文章,其中SQL查询在业务逻辑层(BLL)中构建,这就是为什么我开发的项目将SQL查询保留在BLL中,但现在我觉得我应该将它们移到数据访问层(DAL)。

所以我的问题是:

  1. 将SQL查询保留在BLL中可以吗?还是应该将它们移到DAL中?
  2. 在层之间传输数据时,使用Datatables可以吗?还是应该使用DTO?

您可能会发现https://dev59.com/UG_Xa4cB1Zd3GeqPzk4r#15267352有用。 - Kimi
3个回答

3
将应用程序分成不同层的好处在于,如果你需要更改数据存储库,你可以最小化痛苦进行操作;此外,你可以使用模拟等方式隔离地测试你的对象。
如果你开始将 SQL 查询等硬编码到业务对象中,那么移动到 SQL 而不是 Oracle 可能意味着要重构业务层和数据层中的对象。
我个人认为业务对象不应该看到数据表格。更好的方法是拥有共享对象(或接口),数据层和业务层都可以引用它们。

3
你应该检查像NHibernate或Entity Framework 4+这样的ORM,但由于你正在使用Oracle,所以我认为NHibernate更好。
ORM基本上代表您的数据访问层(DAL),它将负责在当前映射到的数据库方言中为您创建SELECT、INSERT、UPDATE和DELETE语句。
它将允许您对域模型进行查询,而不是对表进行查询。这正是您想要做的。它会抽象出您的数据库,因此您可以在将来创建新的映射并将您的域对象映射到MySQL等其他数据库。或者在某些内存数据库上进行附加映射,以便您可以运行快速集成测试。
学习NHibernate(或其他ORM)是一项投资,但在我看来,如果您将来将与.NET和关系型数据库管理系统一起工作,那么这将是值得您花费时间的。

完全正确。我尝试使用EF,但是遇到了一些与Oracle相关的问题。 - ZedBee

3
Is it okay to keep sql queries in BLL or I should move them to DAL?

这样做可以,但我认为这不是正确的做法。将它们放在它们属于的DAL中。

Is it okay to use datatables for moving data between layers or I should use DTO's instead?

我更喜欢使用DTO,我认为这是正确的方式,但使用DataTables也是可以接受的。


@BigDaddy,你能解释一下你的答案吗?我对你的观点有些认同,但如果我了解你为什么认为在BLL中放置SQL是“可以”的,传递 DataTable 是“可接受的”,我可能会完全同意。 - John M Gant
@JohnMGant...“好”意思是你可以这样做,但在我看来并不正确。数据访问逻辑应该放在DAL或类似的地方,而不是弄乱其他层。至于DTO vs. DataTable,我至少5年没有使用DataTable来传输数据了,但这并不意味着这样做是错误的-对我来说,这使它“可接受”。我总是使用DTO /实体来完成此任务。 - Big Daddy
@BigDaddy,好的,这很有道理。我把“好的”读成“当然,请继续”,并没有在那个句子中得到更多的信息。至于DataTables,我不建议在新设计中使用它。在我看来,最好传递良好定义的业务对象的IEnumerables。这为您提供了更好的处理数据的方法集,并作为奖励提供类型安全性。 - John M Gant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接