最近看到很多人谈多层开发的架构,提到分
presentation
business facade (可选)
business logic
data access + entities
persistence framework(可选)按照这样的层次来看,作为business logic与data access之间的交互, 应该说有一个
DAO(Data Access Object)来负责将Database中的资料抓取出来,返回成所预先定义好
的Entity类型,这里可以允许Entity进行粗粒度的OO定义。而presentation与business logic之间的交互,不应该再看到Data Access层面,所以
这个时候,就需要一些OO定义比较细粒度的Object, 援用DTO(Data Transfer Object)
来解决。从这样看来, UI与business间的交互使用DTO对象,而business与data access的交互
则使用Entity。现在问题来了,在.Net中,aspx页面上面很多的控件,如果需要数据绑定,都是使用的
DataTable/DataView,或是Collection类型来的。而一般来说DAO对象的方法操作的就是
DataTable之类的对象,本应该转换为某个Entity的类型,现在应为要绑定,就只好一路
将DataTable对象扔到上一层,从整个Project来看,我必须每个层面都要针对DataTable
对象进行考虑,这样,层与层间的交互就会应为这个没有很好的隔离性。举例如下:
解决方案 »
- (续)菜鸟请教:求一SQL语句,不知道能不能实现!
- dropdownlist选中某项后,却显示另一项的值?
- Asp.Net返回按钮
- asp.net小问题
- 关于Oracle数据库连接的问题,急!
- 如何共享组件或者控件?
- 绑定datagrid后,增加了四个模板列,怎么样让他显示的时候显示textbox
- 我用asp.net做了一个教育网站,把它放在了服务器上,在客户端运行时好使,可第二天早上来显示错误,意思是连接超出停止的一段英文!
- 关于session
- 最近有大批的从百度搜索过来的,进入本网站。导致500错误
- 分不多了,还是问几个弱弱的问题吧
- ASP.NET中如何觸發Global.asax中的Session_End()事件﹖
//in the domain model.public class EmployeeData : IDisposable
{
public const string MAPPING_TABLE = "Employee";
public const string EmployeeNumber = "empno";
public const string EmployeeName = "emp_name";
public const string OrgId = "OrgId"; //here is the real data, which filled from DAO object
private DataTable dataTable = null; public EmployeeData(DataTable dataTable)
{
this.dataTable = dataTable;
} public DataRow this[int index]
{
get
{
return this.dataTable.Rows[index];
}
}
public DataView DefaultView
{
get
{
return this.dataTable.DefaultView;
}
} public int Count
{
get
{
return this.dataTable.Rows.Count;
}
} #region IDisposable 成員 public void Dispose()
{
this.dataTable.Clear();
this.dataTable.Dispose();
} #endregion
}我有一个DAO对象,EmployeeDAO:public class EmployeeDAO
{
public EmployeeDAO()
{
} public EmployeeData GetEmployeeByOrgId(string orgId)
{
string strSql = "SELECT * FROM emp_data WHERE org_id=@orgId"; IDataParameter[] arySqlParams = new IDataParameter[1]; arySqlParams[0] = new SqlParameter("@orgId", SqlDbType.Char);
arySqlParams[0].Value = orgId; DataSet ds = DBHelper.manager.RetrieveData(new SqlDataAdapter(), strSql, arySqlParams); EmployeeData employeeData = new EmployeeData(ds.Tables[0]); return employeeData;
}
}于是在我的Business Logic中,我就可以这样写EmployeeSystem:public class EmployeeSystem
{
public EmployeeSystem()
{
} public EmployeeData GetEmployeesByOrgId(string orgId)
{
EmployeeDAO employeeDAO = new EmployeeDAO();
return employeeDAO.GetEmployeeByOrgId(orgId);
}
}在我的UI中就可以如此来调用:EmplyeeSystem employeeManager = new EmployeeSystem();
EmployeeData employees = employeeManager.GetEmployeesByOrgId(ddlOrgList.SelectedValue);dgdEmployees.DataSource = employees.DefaultView;
dgdEmployees.DataBind();或是:for(int i=0; i<employees.Count; i++)
{
lblEmployees.Text += employees[i][EmployeeData.EmployeeName].ToString();
}
我也是老用dataset或datatable,这样绑定方便一点
或许层与层之间也可用xml吧,没试过
比如presentation一个DataGrid它就是简单的重现一下数据库里某个表,为什么不能直接将DataTable传过去呢?当然对于一些复杂的prensentation,肯定得有DTO来管理了。
个人觉得如果使用设计模式的思路, UI与business间的交互使用DTO对象,而business与data access的交互则使用Entity。转换的是不是得不偿失就用DataTable一直往上抛吧。^_^
在。NET的在数据集处理DATASET比较方便,想不出为什么放弃它。
就是现在我用nhibernate也特意地加上了返回DATASET查询的方法。
我试过写了个utility类,可以自由的在DataSet,Entity Collection与XML之间转换,但是效果不是很好.
entity的问题是在于处理relationship时比较麻烦,在这里要求有一个比较好的架构来完成数据的persistence.
另外,dto对象直接进行数据绑定也可以的,因为数据绑定是通过reflection来实际的,带来的问题可能是效率不高.同时,在dto与entity之间的转换也要损失一些效率.
另一个问题是这样使事务的处理会集中的businessrule层,而在数据库进行事务处理的效率远远高于(如果可能话)在这一层进行处理。我的意见:
如果不是很大的系统,直接使用DataSet在UI,BR,DA层传输数据就可以了.至于facade层,没有什么必要.
我们现在的做法就是将DataTable往上抛,只有需要的时候才定义entity
我的一点经验是:核心对象一定要在业务层定义好,便于系统的扩展与维护,对于数据层该不该对表现层开放,我觉得应该可以,有时一些简单的业务,直接用DataTable/DataSet实现来的更快,也快捷编码任务。
很多时候 加多一层 entity 不必要
我就是这么做的
现在的项目多出现返回dataSet和DataTable的用法,这种方法写程序
对开发人员来说前期是很方便的,但是,在客户需求变化超出设计预想时,
在原有系统面对多客户时表现出来的问题就很多,开发人员在维护项目时为了提供新功能,在原系统上升级包、打补丁,系统就失去了最初设计时的健壮性、完整性、安全性,系统有它的生命周期,到一定时期了,你的系统已经不能适应客户的大部分需求了,而由于设计时采用了过多的数据表结构定义在各层中出现,升级已经是十分大的工作量了,如果采用实体,应该是一个解决方法,xport(豁然开朗...) 提出的思路很好,我现正在研究Nhibernate希望能解决问题。
2. 請參考 beibeilong(whylove), windancer(^_^) 和CreaTive1911(草草了之) 的回答, 對象集合也可以綁定到DataGird.
3. 不太明白, 是說用DataView做Filter嗎?
4. 這個同意, 但是我們的機器總是越來越好的. :-p
简单的用DataSet就行了
复杂的尽量转换成简单的
实在不行了再用Entity
如果需要修改数据结构的时候,那就是大的改动了,很可能是当初设计的不太合理,要麻烦一点了。
但是改动的地方几乎没有增加,无论架构怎么设计,数据库都是要改的嘛。
看来你还不知道分层的好处,一来中间件可以在各种环境下使用web,client,offiice中通通没有问题,二来尽量减少对其他层的影响,隔离错误。
传递集合时我用dataset 和datatabkl。
DataTable 的 Select() 方法可以在 DataTable 上作查询,比较好用。用对象还有一个麻烦的地方,表达主表、子表数据不方便,不够灵活。一般我们的表很多字段都是放ID,名称都在另外一个表,这样可能会作许多连接查询才可以获得数据,用对象比较麻烦。
===============================================================================
主子表的话,通常使用外键(FK),那么在实体里面其实也是可以表达的,在Entity里面用一个只读的属性(Property)通过ID读取关联表相关内容(比如Name)
这样做的好处是,数据表可以尽量的简化,无需为了编码方便而使用太多的冗余,而在UI层可以非常直观的取到关联表内容
另有一个好处,在数据载入时无需把关联数据一次性载入,在用到的时候再动态读取(Lazyloading)
==========
以上是我的浅见另 祝大家新年快乐 :)
我就是这么做的
=====================================================================================
我也是这么做的,但是我更赞同jyk(喜欢编程。和气生财。共同提高。共同进步) ( ) 信誉:100 2005-2-4 9:25:06 得分: 0
我的看法是:
简单的用DataSet就行了
复杂的尽量转换成简单的
实在不行了再用Entity
======================================================================================不要为模式所约束
对于数据绑定都通过返回一个ArrayList的数组实现.比返回一个DataSet 要快(我认为)。数据的传递以Entity的为主。
但对于一些大型的项目,如有几百个客户端的系统NHibernater不知道合不合适使用,主要是因为NHibernater对数据库的操作,好象太过于频繁。
采用nhibernate是个好提议,如果数据访问很频繁,建议不要使用对于楼主,我给人认为:如果系统不是很庞大,参考duwamish就可以,层与层之间就传dataset
方便的很!但是如果业务规则改变很频繁,可以考虑传递entity