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

我已将所有查询放在(业务逻辑层)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. 可以使用数据表在层之间移动数据还是我应该使用 DTO?
4

3 回答 3

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 是可以接受的。

于 2013-03-12T12:27:39.750 回答
3

将应用程序分层的好处在于,如果您需要更改数据存储库,您可以轻松地做到这一点;另外,您可以使用模拟等单独测试您的对象。

如果您开始将 sql 查询等硬连线到业务对象中 - 比如说,迁移到 SQL 而不是 oracle 可能意味着重构业务层和数据层内的对象。

我个人认为业务对象不应该看到数据表。更好的方法是拥有数据层和业务层都引用的共享对象(或接口)。

于 2013-03-12T12:28:02.183 回答
3

您应该检查像 NHibernate 或 Entity Framework 4+ 这样的 ORM,但是当您使用 Oracle NHibernate 时,IMO 更好。

ORM 将基本上代表您的 DAL,它将负责以您当前映射到的数据库的方言为您创建 SELECT、INSERT、UPDATE 和 DELETE 语句。

它将允许您对域模型而不是表进行查询。这就是你想要做的。它将抽象您的数据库,以便您将来可以进行新的映射并将您的域对象映射到 MySQL。或者在一些内存数据库上做额外的映射,让你运行快速的集成测试。

学习 NHibernate(或其他 ORM)是一项投资,但如果您将来使用 .NET 和 RDBMS,IMO 值得您花时间。

于 2013-03-12T12:35:39.437 回答