怎么取得通过Attribute定义过的保存成员
现在在设计一个简单的架构,在设计过程中遇到一个问题设计思路及面临的问题说明如下:
设计思路:
    应用程序分为5层,分别为:
    数据库访问层:只负责底层数据库的处理(包括SQL,存储过程的执行,事务的处理等工作)
    业务对象层(ORM中的Object,负责按照数据表结构构建与其对应的业务对象,并调用数据访问层进行数据库操作)
    业务逻辑层(负责处理业务对象的业务逻辑)
    外观代理层(负责业务逻辑层与业务外观层的xian接,包括数据绑定<实际上是通过业务逻辑层,将业务外观层的控件与业务对象层的属性进行绑定>,外观事件的处理等)
    外观层(负责处理界面的布局,脚本代码的处理等)现在外观代理层以下的3层都已设计得差不多了
在业务对象层,业务逻辑层,业务外观层中,为每一层都定义了一个基类,负责该层公共消息的处理
现在在设计外观代理层时,在数据绑定模块遇到一个问题)
由于外观代理层已经能够通过业务逻辑层访问业务对象层,我想在外观层将其本身传递到外观代理层,
这样外观代理层就可以同时访问业务逻辑层和外观层,这样就可以在外观代理层完成数据的绑定,
数据绑定的方式采用标签,反射的方式进行
即在外观层中,将需要进行绑定的控件定义一个Attribute标签,
如 [BindAttribute("CompanyName")]
public System.Web.UI.WebControls.TextBox TextBox1;
这样,外观代理层就知道需要将TextBox1绑定到业务对象层的CompanyName属性
在数据读取时,就将业务对象层的CompanyName属性值赋给TextBox1的Text属性值
在数据更新时,就将TextBox1的Text属性值赋给业务对象层的CompanyName属性当然,这还有一个前提,外观层也有一个基类,在传递到外观代理层时,是通过this将外观层对象传递过去
也就是说外观层的基类并不知道哪些控件定义了Attribute标签
完全要通过外观代理层去枚举来获得                //业务逻辑层对象接口
                priavte IBaseBusiness entity = null;
                //control为外观层传递过来的this对象(指针)
public virtual void DataBind(System.Web.UI.Control page)
{
foreach(MemberInfo m in pageGetType().GetMembers())
{
foreach(Attribute attr in Attribute.GetCustomAttributes(m))
if ((attr is BindAttribute) && ((attr as BindAttribute).ID != null))
{
//通过业务逻辑层调用业务层的GetDataObjectPropertyValue方法,取得名称为(attr as BindAttribute).ID的属性值
//如[BindAttribute("CompanyName")],则取得DataObject中的CompanyName属性值
object temp = entity.DataObject.GetDataObjectPropertyValue((attr as BindAttribute).ID);
//????????
/*问题:怎么将temp的值绑定到page页面的TextBox1的Text属性
也就是我怎么知道在Page页面中,是哪个成员定义了CompanyName标签
并通过这个标签去访问到这个成员
其实我现在也有一种最笨的方法就是:
在定义标签时,通过[BindAttribute("CompanyName","TextBox1")]
将其控件ID一并传递到Attribute对象中,然后通过
(control.FindControl((attr as BindAttribute).ComponetName) as System.Web.UI.WebControls.TextBox).Text = temp.ToString();
的方式进行数据的绑定
我试过这种方式可行,但架构上就不是很好,烦请帮忙想想还有没有其它方式
*/

}
}
}
以上代码是可行的,我测试过,就差最后一句,哪位大师级人物帮帮忙!

解决方案 »

  1.   

    以上文字已排版好,在网页里面显得非常乱,大虾们可以将其拷贝到记事本或UE中查看另外这是一个WEB应用程序的架构!
      

  2.   

    用反射是完全可以实现的,一般的ORM就是用到反射来映射的。表现层和数据的邦定可以借鉴微软的例子,它用反射已经实现了一个很好的Demo,你只需要扩充一下就可以使用了。具体参考:
    http://www.microsoft.com/china/msdn/library/webservices/asp.net/aspformbinding.mspx?mfr=true