您的位置:首页 > 运维架构 > 网站架构

.Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

2016-12-19 01:40 1031 查看
再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高。和dezhou聊过之后我仔细考虑了一下,还是解耦吧,本来按照软件设计模式就应该是高内聚低耦合的,低耦合使项目的模块独立于其他模块,增加了可维护性和移植性!

:前面写的博客详细记录没项目操作的每一步,其实写起博客来很费时间,而且整片博文里很多无用的信息。对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进行注入。如下图:





第一个红框内是在《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://git.oschina.net/ninesky/Ninesky

文章发布地址:http://www.ninesky.cn

代码包下载:Ninesky2.3项目架构调整-控制反转和依赖注入的使用.rar

返回目录

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐