小议传统分层与新式分层,抑或与DDD分层 推荐
2011-01-10 14:58
295 查看
引言 |
当然了,出现的这些问题,也可能只是我个人的问题,不代表每个人都存在。无则加勉,有则改正吧。如果是个人的问题,那就当是个人总结吧,大家看看就算了。
这里说到的传统分层,也有可能是我对于分层的错误理解造成的,但是我看见的不只是我的项目是这么的结构,很多的项目也都是这样的结构。里面的代码, 都和我理解的一样,至少可以说明,还是有一部分人犯了和我一样的错误。
传统分层 |
我们先看一个传统分层的解决方案结构。
相互之间的引用关系是:UI引用BLL、Entity、Common;BLL引用IDAL、Entity、Common;IDAL引用Entity;DAL引用IDAL、Entity、Common。
显示行号 复制代码 ? UI Code
private void button1_Click(object sender, EventArgs e)
{
_02_BLL.OrderBll orderBll = Common.ServiceLocator.LoadService<_02_BLL.OrderBll>();
orderBll.SubmitOrder(new _05_Entity.OrderEntity()
{
OrderSeqNo = "123",
OrderAmount = 1000
});
}
显示行号 复制代码 ? BLL Code
public class OrderBll
{
IOrderDal _orderDal;
public OrderBll()
{
_orderDal = Common.ServiceLocator.LoadService<_03_IDAL.IOrderDal>();
}
public bool SubmitOrder(OrderEntity order)
{
return _orderDal.Add(order);
}
}
显示行号 复制代码 ? IDAL Code
public interface IOrderDal
{
bool Add(OrderEntity order);
}
显示行号 复制代码 ? DAL Code
public class OrderDal:_03_IDAL.IOrderDal
{
public bool Add(_05_Entity.OrderEntity order)
{
IDbConnection conn = new SqlConnection();
conn.Open();
IDbCommand comm = conn.CreateCommand();
IDbDataParameter param = comm.CreateParameter();
param.Direction = ParameterDirection.Input;
param.DbType = DbType.String;
param.ParameterName = "OrderSeqNo";
if (comm.ExecuteNonQuery() > 0)
return true;
else
return false;
}
}
显示行号 复制代码 ? Unity Container Locator
using System.Configuration;
using System.Globalization;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using Microsoft.Practices.Unity.InterceptionExtension;
using System.Web;
using System;
namespace Common
{
public static class ServiceLocator
{
// private static readonly InterfaceInterceptor injector = new InterfaceInterceptor ();
private static readonly TransparentProxyInterceptor injector = new TransparentProxyInterceptor();
public static IUnityContainer Container
{
get;
private set;
}
static ServiceLocator()
{
Container = new UnityContainer();
UnityConfigurationSection unitySection = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
if (unitySection == null)
{
throw new ConfigurationErrorsException(string.Format(CultureInfo.CurrentCulture, "missing unity configuration section"));
}
Container.AddNewExtension<Interception>();
unitySection.Configure(Container, "Container");
}
/// <summary>
/// 没?有D为a映3射?指?定¨别e名?
/// name属?性?没?有D赋3值μ
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static T LoadService<T>()
{
Container.Configure<Interception>().SetDefaultInterceptorFor<T>(injector);
return Container.Resolve<T>();
}
/// <summary>
/// 为a映3射?指?定¨别e名?
/// name属?性?赋3值μ
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="serviceName"></param>
/// <returns></returns>
public static T LoadService<T>(string serviceName)
{
Container.Configure<Interception>().SetDefaultInterceptorFor<T>(injector);
return Container.Resolve<T>(serviceName);
}
}
}
上层在调用下层的时候,不是调用自己需要的,而是从下层提供的服务中筛选一些可以用的,凑合用一下。如果发现没有自己可以用的,就在IDAL文件中添加一个,然后在DAL文件中实现以下,这下好了,BLL可以用了。这样也会造成在开发DAL层的时候,没有充分考虑BLL的需要,自己盲目实现一些,然后BLL用的时候,才发现很多还要重新写。造成大量的浪费,代码、人力、时间、精力都浪费一部分了。也会影响到开发的进度。
新式分层,抑或叫做DDD分层 |
先来一张图吧。
DDD中的分层主要是四层:Presentation(表现层),Application(应用层),Domain(领域层),Infrastructure(基础层)。
Presentation相当于以前的UI层。Application是一个任务的调度层,没有实际的业务逻辑,也不推荐放入业务逻辑,实际中可以用Wcf来代替,或者使用普通的类库就可以。其实就是根据UI的业务调用,然后映射到具体的领域对象身上去。也可以通过Application来暴露粗粒度的业务处理,因为领域层的业务处理是细粒度的。没有了以前的DAL,把它的部分放入了Infrastructure层。
以前的IDAL被放入了Domain,在图上,是Domain.Core项目,这个项目会被Infrastructure引用。因为Domain.Core中的IDAL相当于是领域对象对于持久化提出的要求,也就是说必须要实现这些功能,这些都是领域对象需要的。具体的如何实现,具体如何持久化,是持久化到关系数据库还是文件系统,还是内存数据库,都由具体的实现来定义。也就是图中的Infrastructure.Data.Core和Infrastructure.Data.MainModule项目。这两个项目中的实现,实现的都是领域对象持久化所需要的,不会实现一大丢不必要的方法。不知道这算不算是改进呢?
结论 |
不知道大家是如何认识的呢????????期待大家的回复,拍砖。
Technorati 标签: DDD,NLayer,分层
相关文章推荐
- 小议传统分层与新式分层,抑或与DDD分层
- 小议传统分层与新式分层,抑或与DDD分层
- (转)小议传统分层与新式分层,抑或与DDD分层
- 分层自动化测试与传统自动化测试的差别
- 分层自动化测试与传统自动化测试的差别
- 4、传统三层架构与DDD分层架构
- 简单快速开发C\S架构程序用最简单的不分层最快的效率达到功能要求的例子程序FrmCommentAdd
- 使用分层实现业务处理
- 微软受冷落:遭遇传统合作伙伴“大叛逃”
- 多线程总结第三篇之传统线程互斥技术
- 小议truncate、drop、delete的区别
- 传统定时器回顾
- 树莓派、 Arduino 、传统单片机开发板该如何选择?
- 浏览器的工作原理:新式网络浏览器幕后揭秘
- TCP/IP模型以及各个分层的作用
- 常用颜色表以及中国传统颜色名录
- C++新式转型之const_cast
- windows8启动时越过Metro界面直接进入传统桌面的方法
- 主动分层设计的驱动子系统架构模拟