我的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构建的,这就是为什么我开发项目保持BLL中的SQL查询但现在我觉得我应该将它们移动到DAL。
所以我的问题是
答案 0 :(得分: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是可以接受的。
答案 1 :(得分:3)
将应用程序拆分为多层的美妙之处在于,如果您需要更改数据存储库,则可以轻松地执行此操作;另外,您可以使用模拟等方式单独测试对象。</ p>
如果您开始将sql查询等硬连接到业务对象中 - 那么移动,例如,移动到SQL而不是oracle可能意味着重构业务层和数据层中的对象。
我个人认为业务对象不应该看到数据表。更好的方法是拥有数据层和业务层都引用的共享对象(或接口)。
答案 2 :(得分:3)
你应该检查像NHibernate或Entity Framework 4+这样的ORM,但是当你使用Oracle时,NHibernate是更好的IMO。
ORM基本上代表你的DAL,它将负责以你当前映射到的数据库的方言为你创建SELECT,INSERT,UPDATE和DELETE语句。
它允许您对域模型而不是表进行查询。这就是你想要做的。它将抽象您的数据库,以便您将来可以创建新的映射并将您的域对象映射到MySQL。或者在某些内存数据库上执行其他映射,以允许您运行快速集成测试。
学习NHibernate(或其他ORM)是一项投资,但如果您将来使用.NET和RDBMS,那么值得花时间。