项目架构开发:服务层
来源:互联网 发布:mac系统重装教程 编辑:程序博客网 时间:2024/04/29 10:09
上一次(即昨天),我们完成了业务逻辑层的演示;传送门:项目架构开发:业务逻辑层之领域驱动失血模型
设计上虽然还不是太优雅,但是距离真正的OO编程又更近了一步,而且也保留了事务脚本模式的简单快捷的特性
只要后续把Model层丰富起来,那就算是掌握了另一种软件开发模式,而且也是整个思想上的转变。都有点期待了。。
本章我们来完成在业务逻辑层之上的服务层;
服务层并不是必须的,在有一定复杂度的应用程序中,服务层非常有必要创建;而与之相反的就是,
在一些业务逻辑简单的系统中,服务层可能仅仅充当分发功能,没有多余的工作需要组织,这时服务层就显得多余;
而且,服务层一般还与客户端有关系(Web、Winform);如果是Web,在同一系统内,服务层就没有大多必要,除非是跨系统的服务调用;
如果是Winform,那服务层就比较常用,因为Winform是C/S模式,物理层上天生与服务器端分离。
若是从C端远程调用应用逻辑,那有可能在长距离的远程调用中花费太多的时间,而加入服务层情况就会不同
服务层就是为UI何应用逻辑层之间提供一个数据交互的契约,简单点说就是从C端发送一组参数,在S端进行逻辑运算,
因为一般情况下S端与数据库在同一局域网下,访问速度比前者快很多,效率也大大提高
若没有服务层,则需要从UI直接与后端应用程序通信,交互次数大大的增加,通信距离也大大的影响程序性能
我们开始吧。
1、应用逻辑,创建新登录用户
1 public bool Add(AddRequest entity) 2 { 3 this.repository.Add(new LoginUser() 4 { 5 Id = Guid.NewGuid(), 6 LoginName = entity.LoginName, 7 Password = entity.Password, 8 IsEnabled = entity.IsEnabled, 9 CreateTime = DateTime.Now10 });11 this.unitOfWork.Commit();12 13 return true;14 }15 16 public bool Check(string loginName)17 {18 return this.repository.Count(w => w.LoginName == loginName) > 0;19 }
这里添加了2个方法,功能不解释了
现在,我们假设UI层与应用层相距甚远,那直接调用显然是不妥的,我们创建一个服务项目来完成这个功能
2、新建WCF项目
IUserService.cs
1 [ServiceContract] 2 public interface IUserService 3 { 4 [OperationContract] 5 bool Add(AddRequest entity); 6 7 [OperationContract] 8 UserList GetAll(); 9 }10 11 [DataContract]12 public class UserList13 {14 [DataMember]15 public IEnumerable<GetAllResponse> Items { get; set; }16 }
UserService.svc
1 public class UserService : IUserService 2 { 3 public bool Add(AddRequest entity) 4 { 5 var loginUserApp = new LoginUserApplication(); 6 if (loginUserApp.Check(entity.LoginName)) 7 { 8 throw new Exception("登录名称已被占用!"); 9 }10 11 loginUserApp.Add(entity);12 return true;13 }14 15 public UserList GetAll()16 {17 var loginUserApp = new LoginUserApplication();18 var wcf = new UserList();19 wcf.Items = loginUserApp.GetAll();20 21 return wcf;22 }23 }
也很简单明了,在Add方法中我们完成以后的校验与新增
3、新建客户端测试项目
UserService.cs
这个类是系统自动生成的,不用我们自己写
Program.cs
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var userClient = new UserServiceClient(); 6 var addRequest = new Business.DTO.Request.AddRequest() 7 { 8 LoginName = "LoginName" + Guid.NewGuid().ToString(), 9 Password = "Password",10 IsEnabled = 111 };12 userClient.Add(addRequest);13 Console.WriteLine(string.Format("Add finish: {0}", addRequest.LoginName));14 15 var result = userClient.GetAll();16 foreach (var item in result.Items)17 {18 if(item.LoginName == addRequest.LoginName)19 Console.WriteLine(string.Format("Found you: {0}", item.LoginName));20 }21 22 Console.WriteLine("totle:" + result.Items.Count());23 Console.WriteLine();24 25 Console.ReadKey();26 }27 }
看看效果
成功了啊
上边演示的是适合C/S架构,我们再来看看B/S的
4、新建WebApi
UserController.cs
1 public class UserController : ApiController 2 { 3 public IEnumerable<GetAllResponse> GetAll() 4 { 5 var loginUserApp = new LoginUserApplication(); 6 return loginUserApp.GetAll(); 7 } 8 9 public HttpResponseMessage Get(Guid id)10 {11 var loginUserApp = new LoginUserApplication();12 LoginUser loginUser = loginUserApp.Get(id);13 if (loginUser == null)14 {15 return Request.CreateResponse(HttpStatusCode.NotFound);16 }17 18 return Request.CreateResponse(loginUser);19 }20 21 public bool Add(AddRequest user)22 {23 var loginUserApp = new LoginUserApplication();24 if (loginUserApp.Check(user.LoginName))25 {26 throw new Exception("登录名称已被占用!");27 }28 29 return loginUserApp.Add(user);30 }31 }
UserControllerTest.cs
1 public void Add() 2 { 3 var userController = new UserController(); 4 var flag = userController.Add(new AddRequest() 5 { 6 LoginName = "LoginName" + Guid.NewGuid().ToString(), 7 Password = "Password", 8 IsEnabled = 1 9 });10 11 Assert.AreEqual(true, flag);12 }13 14 [TestMethod]15 public void GetAll()16 {17 var userController = new UserController();18 var list = userController.GetAll();19 int count = list.Count();20 21 Assert.AreEqual(true, count > 0);22 }
运行看看效果
看来没什么问题,成功了
看看完整架构
- 项目架构开发:服务层
- 项目架构开发:服务层
- 项目架构开发:服务层
- 项目架构开发:服务层
- 项目架构开发:服务层
- 项目架构开发:服务层
- 项目架构开发:数据访问层之UnitOfWork
- 项目架构开发:数据访问层之UnitOfWork
- 分层架构中的服务层-服务层实战
- 分层架构中的服务层-服务层实战
- JAVA项目服务层总结
- 信息发布系统 Jquery+MVC架构开发(6)BLL层提供WCF 服务
- HTTP服务七层架构技术探讨
- HTTP服务七层架构技术探讨
- HTTP服务七层架构技术探讨
- HTTP服务七层架构技术探讨
- HTTP服务七层架构技术探讨
- HTTP服务七层架构技术探讨
- Laravel 手动分页实现详解
- php 反射学习
- Android,在争议中逃离 Linux 内核的 GPL 约束
- Oracle日期比较:2015/6/3 19:18:29 DATE类型 与 20161128095601 VARCHAR2(16)类型
- Android Studio中导入Eclipse项目
- 项目架构开发:服务层
- 【Linux基础】Linux C编程环境
- 代码复制有风险
- 【第二十一课】流----System类中SetErr和SetOut方法的使用
- 2017年春招途牛前端初面面经
- Linux第二课总结
- Web开发中常见的认证机制
- IOC基础
- eclipse虚拟机内存溢出解决方法