前言

上一篇《一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](三)》,我们完成了:

* 引用SqlSugar

* 使用SqlSugar对Repository类的改造

并成功使用PostRepository来查询到了数据,今天我们来创建一个新的服务层以及安装配置依赖注入框架组件Autofac等。

本篇知识要点

  1. * 创建服务层:TsBlog.Services
  2. * 创建服务接口
  3. * 实现服务接口
  4. * 创建仓储接口
  5. * 安装Autofac依赖注入组件
  6. * 注册配置Autofac 依赖注入

教程内容

创建服务层

选中解决方案中的解决方案文件夹[1.Libraries],右键单击=>>添加=>>新项目,在弹出的对话框中添加一个.NET Framework 4.6.2的C#类库项目,命名为:TsBlog.Services。项目创建成功后,删除自动生成的Class1.cs文件。

由于服务层需要依赖于仓储层,所以首先切换到仓储层[TsBlog.Repositories]项目中,创建博文的仓储接口类:IPostRepository,代码如下:

  1. using System.Collections.Generic;
  2. using TsBlog.Domain.Entities;
  3. namespace TsBlog.Repositories
  4. {
  5. public interface IPostRepository
  6. {
  7. /// <summary>
  8. /// 根据ID查询单条数据
  9. /// </summary>
  10. /// <param name="id">ID</param>
  11. /// <returns></returns>
  12. Post FindById(int id);
  13. /// <summary>
  14. /// 查询所有数据(无分页,大数量时请慎用)
  15. /// </summary>
  16. /// <returns></returns>
  17. IEnumerable<Post> FindAll();
  18. /// <summary>
  19. /// 写入实体数据
  20. /// </summary>
  21. /// <param name="entity">博文实体类</param>
  22. /// <returns></returns>
  23. int Insert(Post entity);
  24. /// <summary>
  25. /// 更新实体数据
  26. /// </summary>
  27. /// <param name="entity">博文实体类</param>
  28. /// <returns></returns>
  29. bool Update(Post entity);
  30. /// <summary>
  31. /// 根据实体删除一条数据
  32. /// </summary>
  33. /// <param name="entity">博文实体类</param>
  34. /// <returns></returns>
  35. bool Delete(Post entity);
  36. /// <summary>
  37. /// 删除指定ID的数据
  38. /// </summary>
  39. /// <param name="id">主键ID</param>
  40. /// <returns></returns>
  41. bool DeleteById(object id);
  42. /// <summary>
  43. /// 删除指定ID集合的数据(批量删除)
  44. /// </summary>
  45. /// <param name="ids">主键ID集合</param>
  46. /// <returns></returns>
  47. bool DeleteByIds(object[] ids);
  48. }
  49. }

再切换到服务层,在刚才创建的服务层项目中首先引用仓储层,并分别创建以下服务接口和类文件:

IPostService.cs:

  1. using System.Collections.Generic;
  2. using TsBlog.Domain.Entities;
  3. namespace TsBlog.Services
  4. {
  5. public interface IPostService
  6. {
  7. /// <summary>
  8. /// 根据ID查询单条数据
  9. /// </summary>
  10. /// <param name="id">ID</param>
  11. /// <returns></returns>
  12. Post FindById(int id);
  13. /// <summary>
  14. /// 查询所有数据(无分页,大数量时请慎用)
  15. /// </summary>
  16. /// <returns></returns>
  17. IEnumerable<Post> FindAll();
  18. /// <summary>
  19. /// 写入实体数据
  20. /// </summary>
  21. /// <param name="entity">博文实体类</param>
  22. /// <returns></returns>
  23. int Insert(Post entity);
  24. /// <summary>
  25. /// 更新实体数据
  26. /// </summary>
  27. /// <param name="entity">博文实体类</param>
  28. /// <returns></returns>
  29. bool Update(Post entity);
  30. /// <summary>
  31. /// 根据实体删除一条数据
  32. /// </summary>
  33. /// <param name="entity">博文实体类</param>
  34. /// <returns></returns>
  35. bool Delete(Post entity);
  36. /// <summary>
  37. /// 删除指定ID的数据
  38. /// </summary>
  39. /// <param name="id">主键ID</param>
  40. /// <returns></returns>
  41. bool DeleteById(object id);
  42. /// <summary>
  43. /// 删除指定ID集合的数据(批量删除)
  44. /// </summary>
  45. /// <param name="ids">主键ID集合</param>
  46. /// <returns></returns>
  47. bool DeleteByIds(object[] ids);
  48. }
  49. }

PostService.cs

  1. using System.Collections.Generic;
  2. using TsBlog.Domain.Entities;
  3. using TsBlog.Repositories;
  4. namespace TsBlog.Services
  5. {
  6. public class PostService : IPostService
  7. {
  8. private readonly IPostRepository _postRepository;
  9. public PostService(IPostRepository postRepository)
  10. {
  11. _postRepository = postRepository;
  12. }
  13. public bool Delete(Post entity)
  14. {
  15. return _postRepository.Delete(entity);
  16. }
  17. public bool DeleteById(object id)
  18. {
  19. return _postRepository.DeleteById(id);
  20. }
  21. public bool DeleteByIds(object[] ids)
  22. {
  23. return _postRepository.DeleteByIds(ids);
  24. }
  25. public IEnumerable<Post> FindAll()
  26. {
  27. return _postRepository.FindAll();
  28. }
  29. public Post FindById(int id)
  30. {
  31. return _postRepository.FindById(id);
  32. }
  33. public int Insert(Post entity)
  34. {
  35. return _postRepository.Insert(entity);
  36. }
  37. public bool Update(Post entity)
  38. {
  39. return _postRepository.Update(entity);
  40. }
  41. }
  42. }

最后,我们再切换到仓储层,在PostRepository文件中使用IPostRepository接口并使用SqlSugar实现该接口中的所有数据操作的方法,

PostRepository.cs

  1. using System.Collections.Generic;
  2. using TsBlog.Domain.Entities;
  3. namespace TsBlog.Repositories
  4. {
  5. /// <summary>
  6. /// POST表的数据库操作类
  7. /// </summary>
  8. public class PostRepository : IPostRepository
  9. {
  10. /// <summary>
  11. /// 根据ID查询
  12. /// </summary>
  13. /// <param name="id">Post ID</param>
  14. /// <returns></returns>
  15. public Post FindById(int id)
  16. {
  17. using (var db = DbFactory.GetSqlSugarClient())
  18. {
  19. var entity = db.Queryable<Post>().Single(x => x.Id == id);
  20. return entity;
  21. }
  22. }
  23. /// <summary>
  24. /// 查询所有数据(无分页,大数量时请慎用)
  25. /// </summary>
  26. /// <returns></returns>
  27. public IEnumerable<Post> FindAll()
  28. {
  29. #region SqlSugar读取方式
  30. using (var db = DbFactory.GetSqlSugarClient())
  31. {
  32. var list = db.Queryable<Post>().ToList();
  33. return list;
  34. }
  35. #endregion
  36. }
  37. /// <summary>
  38. /// 写入实体数据
  39. /// </summary>
  40. /// <param name="entity">博文实体类</param>
  41. /// <returns></returns>
  42. public int Insert(Post entity)
  43. {
  44. using (var db = DbFactory.GetSqlSugarClient())
  45. {
  46. var i = db.Insertable(entity).ExecuteReturnBigIdentity();
  47. //返回的i是long类型,这里你可以根据你的业务需要进行处理
  48. return (int)i;
  49. }
  50. }
  51. /// <summary>
  52. /// 更新实体数据
  53. /// </summary>
  54. /// <param name="entity">博文实体类</param>
  55. /// <returns></returns>
  56. public bool Update(Post entity)
  57. {
  58. using (var db = DbFactory.GetSqlSugarClient())
  59. {
  60. //这种方式会以主键为条件
  61. var i = db.Updateable(entity).ExecuteCommand();
  62. return i > 0;
  63. }
  64. }
  65. /// <summary>
  66. /// 根据实体删除一条数据
  67. /// </summary>
  68. /// <param name="entity">博文实体类</param>
  69. /// <returns></returns>
  70. public bool Delete(Post entity)
  71. {
  72. using (var db = DbFactory.GetSqlSugarClient())
  73. {
  74. var i = db.Deleteable(entity).ExecuteCommand();
  75. return i > 0;
  76. }
  77. }
  78. /// <summary>
  79. /// 删除指定ID的数据
  80. /// </summary>
  81. /// <param name="id">主键ID</param>
  82. /// <returns></returns>
  83. public bool DeleteById(object id)
  84. {
  85. using (var db = DbFactory.GetSqlSugarClient())
  86. {
  87. var i = db.Deleteable<Post>(id).ExecuteCommand();
  88. return i > 0;
  89. }
  90. }
  91. /// <summary>
  92. /// 删除指定ID集合的数据(批量删除)
  93. /// </summary>
  94. /// <param name="ids">主键ID集合</param>
  95. /// <returns></returns>
  96. public bool DeleteByIds(object[] ids)
  97. {
  98. using (var db = DbFactory.GetSqlSugarClient())
  99. {
  100. var i = db.Deleteable<Post>().In(ids).ExecuteCommand();
  101. return i > 0;
  102. }
  103. }
  104. }
  105. }

到这里,我们的仓储和服务层准备工作就完成了,接下来安装依赖注入组件:Autofac

安装Autofac

选择解决方案夹[2.Persentation]中的Web项目[TsBlog.Frontend],在"引用"("References")上单击右键,调出Nuget程序包管理界面,搜索"autofac",如下:

Autofac的当前版本为:v4.6.2

同时,再搜索"Autofac.Mvc5",如下:

配置/注册依赖选项

Autofac安装完成之后,我们需要对依赖的接口对实现在Autofac中进行注册,本示例的Autofac配置在Global.asax文件中(请确保TsBlog.Frontend项目中引用了:TsBlog.Domain,TsBlog.Repositories,TsBlog.Servcies这本个项目),如下:

Global.asax

  1. using Autofac;
  2. using Autofac.Integration.Mvc;
  3. using System.Web.Mvc;
  4. using System.Web.Routing;
  5. using TsBlog.Repositories;
  6. using TsBlog.Services;
  7. namespace TsBlog.Frontend
  8. {
  9. public class MvcApplication : System.Web.HttpApplication
  10. {
  11. protected void Application_Start()
  12. {
  13. AreaRegistration.RegisterAllAreas();
  14. FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  15. RouteConfig.RegisterRoutes(RouteTable.Routes);
  16. //BundleConfig.RegisterBundles(BundleTable.Bundles);
  17. AutofacRegister();
  18. }
  19. private void AutofacRegister()
  20. {
  21. var builder = new ContainerBuilder();
  22. //注册MvcApplication程序集中所有的控制器
  23. builder.RegisterControllers(typeof(MvcApplication).Assembly);
  24. //注册仓储层服务
  25. builder.RegisterType<PostRepository>().As<IPostRepository>();
  26. //注册服务层服务
  27. builder.RegisterType<PostService>().As<IPostService>();
  28. //注册过滤器
  29. builder.RegisterFilterProvider();
  30. var container = builder.Build();
  31. //设置依赖注入解析器
  32. DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
  33. }
  34. }
  35. }

然后,我们修改控制器文件夹中的HomeController,修改后的代码如下:

HomeController.cs

  1. using System.Web.Mvc;
  2. using TsBlog.Services;
  3. namespace TsBlog.Frontend.Controllers
  4. {
  5. public class HomeController : Controller
  6. {
  7. private readonly IPostService _postService;
  8. public HomeController(IPostService postService)
  9. {
  10. _postService = postService;
  11. }
  12. public ActionResult Index()
  13. {
  14. return View();
  15. }
  16. public ActionResult Post()
  17. {
  18. //var postRepository = new PostRepository();
  19. //var post = postRepository.FindById(1);
  20. //return View(post);
  21. var post = _postService.FindById(1);
  22. return View(post);
  23. }
  24. }
  25. }

再次按F5运行,打开页面:http://localhost:54739/home/post,这次我们可以看到和前两篇一样的运行效果了:

本文的源码托管地址:https://github.com/lampo1024/TsBlog/releases/tag/v1.4

本文学习到此结束,本系列未完待续......

如果你喜欢Rector的本系列文章,请为我点个大大的赞,以支持Rector在后续的写作中更有基(激)情,哈哈。。。

本文同步发表至 图享网一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](四)

一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](四)的更多相关文章

  1. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)

    前言 Hi,大家好,我是Rector 时间飞逝,一个星期又过去了,今天还是星期五,Rector在图享网继续跟大家分享系列文本:一步一步创建ASP.NET MVC5程序[Repository+Autof ...

  2. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](一)

    前言 大家好,我是Rector 从今天开始,Rector将为大家推出一个关于创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar]的文章系列, ...

  3. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](三)

    前言 上一篇<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)>我们通过如下操作: 创建实体及工具类 创建Re ...

  4. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)

    前言: 在本系列第一篇<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](一)>中,我为大家介绍了搭建空白解决方案以 ...

  5. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](六)

    前言 大家好,我是Rector 又是星期五,很兴奋,很高兴,很high...啦啦啦... Rector在图享网又和大家见面啦!!!上一篇<一步一步创建ASP.NET MVC5程序[Reposit ...

  6. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](七)

    前言 大家好,我依旧是你们的老朋友Rector,很高兴又在周五的时候准时和大家见面. Rector的系列文章[一步一步创建ASP.NET MVC5程序[Repository+Autofac+Autom ...

  7. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](八)

    前言 Hi, 大家好,还是星期五,还是Rector,又在图享网准时和大家见面了. 今天给大家带来系列教程<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Auto ...

  8. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](九)

    前言 童鞋们,大家好 我是专注.NET开发者社区建设的实践者Rector. 首先,为自己间隔了两个星期五再更新本系列文章找个不充分的理由:Rector最近工作,家庭的各种事务所致,希望大家谅解. 本文 ...

  9. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十)

    前言 朋友们, 大家好,我还是Rector,写ASP.NET MVC 5系列文章[一步一步创建ASP.NET MVC5程序Repository+Autofac+Automapper+SqlSugar] ...

随机推荐

  1. Visual Studio Code作为Angular开发工具常用插件安装、json-server安装与使用、angular/cli安装失败问题

    前提准备: 搭建好Angular开发环境 1 安装Visual Studio Code 教程简单,不会的去问度娘 2 安装Chrome浏览器 教程简单,不会的趣闻度娘 3 Visual Studio ...

  2. JAVA IO分析三:IO总结&文件分割与合并实例

    时间飞逝,马上就要到2018年了,今天我们将要学习的是IO流学习的最后一节,即总结回顾前面所学,并学习一个案例用于前面所学的实际操作,下面我们就开始本节的学习: 一.原理与概念 一.概念流:流动 .流 ...

  3. InfluxDB:cannot use field in group by clause

    最近在使用InfluxDB时,发现一个很奇怪的问题,一个本来正常的功能,做了一次改动后,就不能正常显示了. 一.查询语句 SELECT MEMORY FROM "ACM_PROCESS_MO ...

  4. 使用canvas实现绚丽的时钟特效

    源码 https://github.com/2016Messi/Gorgeous-clock 效果展示 https://2016messi.github.io/Gorgeous-clock/ 如果各位 ...

  5. ES6之Symbol

    ES6中Symbol是为了防止属性名冲突而引入的,是独一无二的.Symbol值是通过Symbol函数生成.Symbol值不能与其他类型的值运算否则会报错且Symbol的值可以转换为字符串或者是布尔值但 ...

  6. Find the Maximum sum

    Given an array of n elements.Find the maximum sum when the array elements will be arranged in such w ...

  7. 修改Linux内核参数提高Nginx服务器并发性能

    当linux下Nginx达到并发数很高,TCP TIME_WAIT套接字数量经常达到两.三万,这样服务器很容易被拖死.事实上,我们可以简单的通过修改Linux内核参数,可以减少Nginx服务器 的TI ...

  8. 快速开发 jQuery 插件的 10 大技巧

    在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式.这样我就可以 copy & paste 大部分的代码结构,只要专注最主要的逻辑代码就行了. ...

  9. 关于oracle数据库 跨表查询建立 视图的方法

    工作中很多时候都会遇到需要将两个不同的表空间甚至数据库的表进行联合查询或者建立视图的情况. 不同的表空间查询我们可以通过在将要查询的表前面加上 表空间的对应的用户名来实现,如有两个表空间分别对应两个用 ...

  10. TurnipBit之DIY无线遥控智能小车

    一.准备工作 TurnipBit 开发板 2块 TurnipBit 扩展板 1块 数据线 1条 智能小车器件 1套 电机驱动模块(L298N) 1个 在线可视化编程 点击进入   二.思路设计   2 ...