日期:2014-05-17  浏览次数:20454 次

关于三层架构中的实体类。
在三层架构中有一个实体类,但是用到了实体类感觉限制了UI层的操作。这些怎么衡量舍取?比如我在UI显示的是学号、姓名、班级名称。而实体类中的是学号、姓名、班级的ID。通过实体类操作起来麻烦多了。

------解决方案--------------------
基本上对于许多人的asp.net程序,其实就是一个类似于本地单机小程序。

如果你做大一点的程序,比如说一个做手机软件系统开发的公司,它以为电话之间通讯就是往关系数据库里insert语音数据,而认为移动公司的协议“限制了其手机软件操作”,这怎样看待?

其实通讯协议(以及移动公司各种业务的协议)正是因为定一个这种限制,才使得业务可以真正大规模开展开来。只不过有些客户端开发人员的层次问题,以为什么软件的开发技术都是“往数据库表里‘增删改查’而已”的操作,而不能适应真正的设计和开发技术的需要。
------解决方案--------------------
asp.net一直以来以门槛最低、需要的编程层次最低而著名。自从2005年,asp.net支持了一系列数据源控件(例如ObjectDataSource),你就可以直接将程序设计分层,而不同的界面层代码可以通过数据源控件复用相同的底层(另外一层)代码。ObjectDataSource的接口当然就是基于实体的。

假设你的程序使用到“学号、姓名、班级名称”,而一个ObjectDataSource所调用的查询列表结果只能反映“学号、姓名、班级的ID”怎么办?这自然有两种做法。一种是要求新建一个业务逻辑方法来反映“学号、姓名、班级名称”,另外一种是在控件上绑定“班级ID”的时候使用绑定表达式让其调用一个“输入班级ID而返回班级名称”的业务逻辑方法嘛!

其实这看上去很简单,关键地只是思想。“输入班级ID而返回班级名称”作为一个业务逻辑层方法,被预先定义出来,不断被各种表现层方法复用。至于这个方法内部是如何使用缓存的、如何访问数据库的,表现层根本无需操心,表现层的设计时只要知道调用这个Api即可停止再去纠结其内部细节。
------解决方案--------------------
三层架构:
表现层(UI),业务逻辑层(BLL),数据访问层(DAL)。
搭建三层架构步骤:
创建解决方案(xx)->添加模型层类库(xxModels)->数据访问层类库(xxDAL)->业务逻辑层类库(xxBLL)->表示层web程序(xx)。
xxModels:一个models对应一个sql表,文件名与表名同名
xxDAL:右键添加引用xxModels;文件名以Service结尾
xxBLL:右键添加引用xxDAL,xxModels;文件名以Manager结尾 xx(表示层):右键添加引用xxBLL,xxModels;文件名为"所在文件夹名_文件名"

------解决方案--------------------
你可以针对视图建实体类
还有更绝的 就是可以用延迟加载 简单的延迟加载利用委托实现
C# code

namespace XFramework.Model
{
    [Serializable]
    public partial class news: IModelCommon
    {
        public const int CASE_TYPE_NEWS_CLASS_ID = -1;

        public delegate string GetNewsClassName(int classID);

        public delegate string GetBrandName(int brandID);

        public GetNewsClassName OnGetNewsClassName;

        public GetBrandName OnGetBrandName;

        private string _newsClass = null;

        private string _brandName = null;

        #region IModelCommon 成员

        public int ID
        {
            get
            {
                return this.news_id;
            }
            set
            {
                this._news_id = value;
            }
        }

        #endregion

        public string NewsClass
        {
            get
            {
                if (!string.IsNullOrEmpty(this._newsClass))
                {
                    return _newsClass;
                }
                if (OnGetNewsClassName != null)
                {
                    _newsClass = OnGetNewsClassName(this._news_class.GetValueOrDefault());//这边通过委托回调给newsClass赋值,这个回调方法其实是在业务层里面的,方便写可以直接用lambda
                    OnGetNewsClassName = null;//手动把委托设置为null以便垃圾收集
                    return _newsClass;
                }
                return string.Empty;
            }
        }
    }
}

------解决方案--------------------
其实、看你怎么用吧。你觉得限制了UI层的使用、但是我觉得实体类还是很重要的。就像他们说的学生类、你可以在new一个学生的时候、传一个学生的ID、然后通过学生就能拿到你想要的其他属性。还是很方便的吧。