作者:yzlhccdec 来源:博客园   酷勤网收集 2008-03-13

摘要
  自从DLINQ出现后,对传统的三层架构有了一点影响。因为LINQ本身可以作为一个Thin DAL使用,当然也可以在它的基础上再封装一次,实现DAL接口。不过我的问题是,如果我们把LINQ封装起来用的话,岂不是LINQ带来的动态生成查询的好处就不存在了?

1.我们在设计网站的时候,经常有前台用于展现的实体和后台用于持久化的实体不完全相同的情况。比如星座这种数据,在后台存的可能是一个tinyint值,但是在前台显示的时候肯定要转成“某某座”这样,对于这种情况,我现在的处理方法是建立PO,VO两种对象,但现在有两个问题:1.VO、PO定义在哪?是分别定义到自己所属的层,不允许穿透?还是统一定义到Model层里面去?2.VO<->PO在哪进行转换?(如果都放到BLL层,会造成BLL层过于臃肿。如果放到对象内部的话,有时候又不得不在对象内部调用持久化方法,虽然我现在的做法是把不依赖于持久化的方法放到对象内部,但是总觉得这样的话逻辑过于分散,不好管理)

2.BLL到底是写成实体类好还是静态类好?我曾经看过CM的代码,发现它BLL层的方法全是Static的,我个人也觉得用Static是不是会好一点?因为我暂时没碰到过BLL里面要继承或者是实现接口的。

3.自从DLINQ出现后,对传统的三层架构有了一点影响。因为LINQ本身可以作为一个Thin DAL使用,当然也可以在它的基础上再封装一次,实现DAL接口。不过我的问题是,如果我们把LINQ封装起来用的话,岂不是LINQ带来的动态生成查询的好处就不存在了?因为如果采用实现接口的形式的话,其返回类型势必不能是IQueryable。

评论1:

1、关于你说的下星座,其实很简单呀,建立一个数组

string[] stars = new string[starCount];
stars[0] = "金牛";
......

后台存的可能是一个tinyint值,这个值就是数组下标,一般都是连续的,即使是不连续的,浪费一连个也无所谓。

由于星座是固定不变的,定义成静态的就可以了。

调用(转换)就很简单了

显示:stars[后台的tinyint值] 。
这样不就转换了吗。


至于你说的 PO,VO 听说过,但是没有用过。我说的这个数组应该放在哪里,或者属于哪一部分的,我也不知道 ,因为我不是这么分层的。


2、BLL我个人感觉还是写成实体类的好。虽然每次实例的时候都要占用一点cpu但是,及时销毁的话会节省不少的内存。除非你的每一个页面的访问频率都很高。

另外对于静态函数还是比较模糊,最怕的就是出现“千军万马过独木桥”的情况。


不要为了oo而oo。网站嘛,很简单的就可以搞定了,用oo反而麻烦。

评论2:

我觉得网站这种业务逻辑很简单的情况,三层根本派不上用处,或者说发挥不出来应有的威力。

(注释:网站指的是前台显示数据的部分,就是呈现一个页面给用户看。)

我是怎么分层的呢?简单的说就是不分层。:)

举个简单的例子:

我想显示一个新闻,我会在后置代码里面定义一个

protected string[] str

然后在page_Load里面给 str 赋值

str = dal.RunSqlStrings("select col1,col2,col3 from table where NewsID =" + NewsID);

/*
注释:
dal 是一个类似于SQLHelp的东东,是我自己写的一个访问数据库的方法。不同点有很多,最明显的就是——需要实例化!

RunSqlStrings:运行sql语句,返回第一条记录的信息(按照select 里的字段的顺序放在数组里面)。
这是通用的方法,所以不用每一个项目都写一遍。封装到dll里面,在项目里引用就可以了。

详细信息可以看我的blogs

http://www.cnblogs.com/jyk/category/67121.html

*/

然后在前台就可以使用了,想在哪里放什么就在哪里放。例如

<%=str[1]%>
作者:<%=str[2]%> 人气:<%=str[3]%>

<%=str[4]%>


您可能觉得这么写有点像asp的代码,其实我感觉用asp写网页(不包括后台管理)是最方便的。

这样做可以很方便的应对美工,美工怎么做页面都可以,我做以下替换就可以了。

我知道您一定会说这么做有很多的缺点。

1、UI层里直接写了sql语句。
2、str[1] 根本就不知道里面放的是什么!出错了再编译的时候也不会被发现。
3、好多好多的不符合某某规范的地方。


优点就是代码少!

.aspx文件里面就是 这么一句 <%=str[1]%> 根据需要放置就可以了。

后置代码呢,也就一句:
str = dal.RunSqlStrings("select col1,col2,col3 from table where NewsID =" + NewsID);

(不包括实例化和销毁实例的代码,其实也就是再加两句话)

一个简单的显示数据的页面就搞定了。

dal.RunSqlStrings 的实现代码是通用的,封装好了调用就可以了,不需要算在项目的代码里面。


也就是说:两行代码搞定!


 就这个例子让我分出来三层,怎么分呢?

如果硬要分的话只好说:

.aspx 算作UI层
.aspx.cs 算作逻辑层
dal 的代码算作数据层
或则把sql语句算作 逻辑层 or 数据层


这么分一定会有好多人反对,不过就这么两行代码。实在不行就算作是一层的吧。

来自:http://www.cnblogs.com/yzlhccdec/archive/2008/03/13/1103023.html

分类: 系统架构 设计模式



关于酷勤 | 联系方式 | 免责声明 | 友情链接