WEB开发网
开发学院软件开发C语言 Effective C# 原则23:避免返回内部类对象的引用 阅读

Effective C# 原则23:避免返回内部类对象的引用

 2009-02-19 08:16:30 来源:WEB开发网   
核心提示: DataViewManager创建DataView来访问DataSet里的个别数据表,DataViewManager没有提供任何方法来修改DataSet里的数据表,Effective C# 原则23:避免返回内部类对象的引用(3),每一个DataView可以被配置为许可修改个别数据元素,但

DataViewManager创建DataView来访问DataSet里的个别数据表。DataViewManager没有提供任何方法来修改DataSet里的数据表。每一个DataView可以被配置为许可修改个别数据元素,但客户不能修改数据表,或者数据表的列。读/写是默认的,因此客户还是可以添加,修改,或者删除个别的数据条目。

在我们开始讨论如何创建一个完全只读的数据视图时以前,让我先简单的了解一下你应该如何响应公共用户的修改。这是很重要的,因为你可能经常要暴露一个DataView给UI控件,这样用户就可以编辑数据(参见原则38)。确信你已经使用过Windows表单的数据绑定,用来给用户提供对象私有数据编辑。DataSet里的DataTable引发一些事件,这样就可以很容易的实现观查者模式:你的类可以响应其它客户的任何修改。DataSet里的DataTable对象会在数据表的任何列以及行发生改变时引发事件。ColumnChanging和RowChanging事件会在编辑的数据提交到DataSet前被引发。而ColumnChanged和RowChanged事件则是在修改提交后引发。

任何时候,当你期望给公共客户提供修改内部数据的方法时,都可以扩展这样的技术,但你要验证而且响应这些改变。你的类应该对内部数据结构产生的事件做一些描述。事件句柄通过更新这些内部的状态来验证和响应改变。

回到原来的问题上,你想让客户查看你的数据,但不许做任何的修改。当你的数据存储在一个DataSet里时,你可以通过强制在DataTable上创建一个DataView来防止任何的修改。DataView类包含一些属性,通过定义这些属性,可以让DataView支持在实际的表上添加,删除,修改甚至是排序。你可以在被请求的DataTable上使用索引器,通过创建一个索引器来返回一个自定义的DataView:

public class MyBusinessObject
{
 // Read Only property providing access to a
 // private data member:
 private DataSet _ds;
 public IList this[ string tableName ]
 {
  get
  {
   DataView view =
    _ds.DefaultViewManager.CreateDataView
    ( _ds.Tables[ tableName ] );
   view.AllowNew = false;
   view.AllowDelete = false;
   view.AllowEdit = false;
   return view;
  }
 }
}
// Access the dataset:
  IList dv = bizOjb[ "customers" ];
  foreach ( DataRowView r in dv )
   Console.WriteLine( r[ "name" ] );

这个类的最后一点摘录(的代码)通过访问IList接口引用,返回这个实际数据表上的视图。你可以在任何的集合上使用IList接口,并不仅限于DataSet。你不应该只是简单的返回DataView对象。用户可以再次简单的取得编辑,添加/删除的能力。你返回的视图已经是自定义的,它不许可在列表的对象上做任何的修改。返回的IList指针确保客户没有像DataView对象里赋于的修改权利。

从公共接口上暴露给用户的引用类型,可以让用户修改对象内部成员,而不用访问该对象。这看上去不可思议,也会产生一些错误。你须要修改类的接口,重新考虑你所暴露的是引用而不是值类型。如果你只是简单的返回内部数据,你就给了别人机会去访问内部成员。你的客户可以调用成员上任何可用的方法。你可以通过暴露接口来限制一些内部私有数据访问,或者包装对象。当你希望你的客户可以修改你的内部数据时,你应该实现你自己的观察者模式,这样你的对象可以验证修改或者响应它们。

上一页  1 2 3 

Tags:Effective 原则 避免

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接