.Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用
2016-12-19 01:40
1031 查看
再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高。和dezhou聊过之后我仔细考虑了一下,还是解耦吧,本来按照软件设计模式就应该是高内聚低耦合的,低耦合使项目的模块独立于其他模块,增加了可维护性和移植性!
注:前面写的博客详细记录没项目操作的每一步,其实写起博客来很费时间,而且整片博文里很多无用的信息。对MVC来说会添加控制器,添加视图,添加类这些都最基本的要求了,并且前面博文里都写了,后面也就不再详细写这些东西了,主要写一些思路和关键代码,具体内容以源代码的形式放在博客后面提供下载。
然后我们进入,Web的启动类Startup进行注入。如下图:
![](https://images2015.cnblogs.com/blog/132313/201612/132313-20161219013931525-255879934.png)
第一个红框内是在《2.1、栏目的前台显示》中注入的上下文;
第二个红框到第四个红框内是今天添加的内容。
第三个红框内注入InterfaceBaseRepository接口,使用BaseRepository进行实例化。
有第二个红框的内容是因为BaseRepository实例化时有一个DbContext类型的参数。在注入的时候要求用到的参数必须要在前面注入,并且系统并不会自动吧NineskyDbContext转换为DbContext。所以必须注入一个DbContext类型的参数。
第四个红框是注入CategoryService。这里CategoryService同样可以使用接口,时间原因没写。
至此可以看到,CategoryService解除了对BaseRepository的依赖,在Ninesky.Base项目中没有对Ninesky.DataLibrary进行任何的依赖,类的实例化是在Web项目中进行注入的,Web项目对Ninesky.DataLibrary进行了依赖。同样的方法也可以实现Web项目对Ninesky.Base项目的解耦。
如果要完全解除Ninesky.Web项目对Ninesky.DataLibrary和Ninesky.Base项目的依赖,可以使用配置文件加载,这次先不写了。
F5浏览器中查看一下,可以看到取出了数据,只是因为数据存储层的代码没有包含导航属性所以数据不完整。
![](https://images2015.cnblogs.com/blog/132313/201612/132313-20161219013932025-1862329481.png)
代码包下载:Ninesky2.3项目架构调整-控制反转和依赖注入的使用.rar
返回目录
注:前面写的博客详细记录没项目操作的每一步,其实写起博客来很费时间,而且整片博文里很多无用的信息。对MVC来说会添加控制器,添加视图,添加类这些都最基本的要求了,并且前面博文里都写了,后面也就不再详细写这些东西了,主要写一些思路和关键代码,具体内容以源代码的形式放在博客后面提供下载。
一、默认项目结构
我们看一下,vs2015默认生成的项目结构。1 public class CategoryController : Controller 2 { 3 /// <summary> 4 /// 数据上下文 5 /// </summary> 6 private NineskyDbContext _dbContext; 7 8 /// <summary> 9 /// 栏目服务 10 /// </summary> 11 private CategoryService _categoryService; 12 13 public CategoryController(CategoryService categoryService) 14 { 15 _categoryService = categoryService; 16 } 17 18 /// <summary> 19 /// 查看栏目 20 /// </summary> 21 /// <param name="id">栏目Id</param> 22 /// <returns></returns> 23 [Route("/Category/{id:int}")] 24 public IActionResult Index(int id) 25 { 26 var category = _categoryService.Find(id); 27 if (category == null) return View("Error", new Models.Error { Title = "错误消息", Name="栏目不存在", Description="访问ID为【"+id+"】的栏目时发生错误,该栏目不存在。" }); 28 switch (category.Type) 29 { 30 case CategoryType.General: 31 if (category.General == null) return View("Error",new Models.Error { Title="错误消息", Name="栏目数据不完整",Description="找不到栏目【"+category.Name+"】的详细数据。" }); 32 return View(category.General.View, category); 33 case CategoryType.Page: 34 if (category.Page == null) return View("Error", new Models.Error { Title = "错误消息", Name = "栏目数据不完整", Description = "找不到栏目【" + category.Name + "】的详细数据。" }); 35 return View(category.Page.View, category); 36 case CategoryType.Link: 37 if (category.Link == null) return View("Error", new Models.Error { Title = "错误消息", Name = "栏目数据不完整", Description = "找不到栏目【" + category.Name + "】的详细数据。" }); 38 return Redirect(category.Link.Url); 39 default: 40 return View("Error", new Models.Error { Title = "错误消息", Name = "栏目数据错误", Description = "栏目【" + category.Name + "】的类型错误。" }); 41 42 } 43 } 44 }View Code
然后我们进入,Web的启动类Startup进行注入。如下图:
![](https://images2015.cnblogs.com/blog/132313/201612/132313-20161219013931525-255879934.png)
第一个红框内是在《2.1、栏目的前台显示》中注入的上下文;
第二个红框到第四个红框内是今天添加的内容。
第三个红框内注入InterfaceBaseRepository接口,使用BaseRepository进行实例化。
有第二个红框的内容是因为BaseRepository实例化时有一个DbContext类型的参数。在注入的时候要求用到的参数必须要在前面注入,并且系统并不会自动吧NineskyDbContext转换为DbContext。所以必须注入一个DbContext类型的参数。
第四个红框是注入CategoryService。这里CategoryService同样可以使用接口,时间原因没写。
至此可以看到,CategoryService解除了对BaseRepository的依赖,在Ninesky.Base项目中没有对Ninesky.DataLibrary进行任何的依赖,类的实例化是在Web项目中进行注入的,Web项目对Ninesky.DataLibrary进行了依赖。同样的方法也可以实现Web项目对Ninesky.Base项目的解耦。
如果要完全解除Ninesky.Web项目对Ninesky.DataLibrary和Ninesky.Base项目的依赖,可以使用配置文件加载,这次先不写了。
F5浏览器中查看一下,可以看到取出了数据,只是因为数据存储层的代码没有包含导航属性所以数据不完整。
![](https://images2015.cnblogs.com/blog/132313/201612/132313-20161219013932025-1862329481.png)
八、其他
代码托管地址:https://git.oschina.net/ninesky/Ninesky
文章发布地址:http://www.ninesky.cn代码包下载:Ninesky2.3项目架构调整-控制反转和依赖注入的使用.rar
返回目录
相关文章推荐
- .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
- 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获
- 搞定.NET MVC IOC控制反转,依赖注入
- ASP.NET Core中的依赖注入(1):控制反转(IoC)
- .Net Core MVC 网站开发(Ninesky) 2.2、栏目管理功能-System区域添加
- ASP.NET Core中的依赖注入(1):控制反转(IoC)
- spring.net基本使用:控制反转和依赖注入
- Spring.net 控制反转(IOC)依赖注入(DI)的使用 以及Config文件的配置
- .Net Core MVC 网站开发(Ninesky) 2.4、添加栏目与异步方法
- ASP.NET Core中的依赖注入(1):控制反转(IoC)
- C# .net mvc 依赖注入、控制反转、Ioc、Autoface(草稿)
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(六)-- 依赖注入
- ASP.NET MVC中使用Unity进行依赖注入的三种方式
- 扩展ASP.NET MVC三层框架且使用StructureMap实现依赖注入1-Model层
- mvc 控制反转Ninject(依赖注入容器)
- 扩展ASP.NET MVC三层框架并使用StructureMap实现依赖注入2
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之调整首页显示
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之调整首页显示
- MVC 依赖注入/控制反转