ASP.NET5+EntityFramework7开发实践(三)

1.说明

在《ASP.NET5+EntityFramework7开发实践(一)》介绍过仓储模式,只是没有在控制器中如何使用?

本章重新补充一下。注意,也会使用ASP.NET5中的依赖注入。

2.仓储模式

先看接口:

 1   public interface IRoleRepository:IDisposable
 2     {
 3         //IEnumerable和IQueryable
 4         //二者在EF都会延迟加载,不同的是:
 5         //IEnumerable是数据加载到内存,刷选在内存中的数据上执行
 6         //IQueryable是查询和刷选在数据源中执行
 7         //TODO:复杂条件查询和异步方法
 8         //IQueryable<Role> GetRoles();
 9
10         IEnumerable<Role> GetRoles();
11         Role GetRole(int? id);
12         void Create(Role role);
13         void Update(Role role);
14         void Delete(int? id);
15     }

再看其实现:

 public class RoleRepository : IRoleRepository
    {
        private EFContext db;
        public RoleRepository(EFContext _db)
        {
            db = _db;
        }

        public IEnumerable<Role> GetRoles()
        {
            return db.Roles.ToList();
        }

        public Role GetRole(int? id)
        {
            return db.Roles.Single(m => m.Id == id);
        }

        public void Create(Role role)
        {
            db.Roles.Add(role);
            db.SaveChanges();
        }

        public void Delete(int? id)
        {
            db.Roles.Remove(db.Roles.Single(m => m.Id == id));
            db.SaveChanges();
        }

        public void Update(Role role)
        {
            //注意: db.Roles.Update(role); 不行的
            db.ChangeTracker.AcceptAllChanges();
            db.SaveChanges();
        }

        #region 释放资源
        private bool disposed = false;
        protected virtual void Dispose(bool disposing)
        {
            if (!disposed)
            {
                if (disposing) { db.Dispose(); }
            }
            disposed = true;
        }
        public void Dispose()
        {
            Dispose(true);
            System.GC.SuppressFinalize(this);
        }
        #endregion
    }

3.控制器使用  

 1     public class RoleController : Controller
 2     {
 3         //注意使用接口哦
 4         private IRoleRepository roleRepository;
 5         public RoleController(IRoleRepository _roleRepository)
 6         {
 7             roleRepository = _roleRepository;
 8         }
 9
10         public IActionResult Index()
11         {
12             return View(roleRepository.GetRoles());
13         }
14         public IActionResult Details(int? id)
15         {
16             if (id == null) { return HttpNotFound(); }
17
18             Role role = roleRepository.GetRole(id);
19
20             if (role == null) { return HttpNotFound(); }
21
22             return View(role);
23         }
24
25         public IActionResult Create()
26         {
27             return View();
28         }
29
30         [HttpPost]
31         [ValidateAntiForgeryToken]
32         public IActionResult Create(Role role)
33         {
34             if (ModelState.IsValid)
35             {
36                 roleRepository.Create(role);
37                 return RedirectToAction("Index");
38             }
39             return View(role);
40         }
41
42         public IActionResult Edit(int? id)
43         {
44             if (id == null) { return HttpNotFound(); }
45
46             Role role = roleRepository.GetRole(id);
47             if (role == null)
48             {
49                 return HttpNotFound();
50             }
51             return View(role);
52         }
53
54         [HttpPost]
55         [ValidateAntiForgeryToken]
56         public IActionResult Edit(Role role)
57         {
58             if (ModelState.IsValid)
59             {
60                 roleRepository.Update(role);
61                 return RedirectToAction("Index");
62             }
63             return View(role);
64         }
65
66         [ActionName("Delete")]
67         public IActionResult Delete(int? id)
68         {
69             if (id == null) { return HttpNotFound(); }
70
71             Role role = roleRepository.GetRole(id);
72
73             if (role == null) { return HttpNotFound(); }
74
75             return View(role);
76         }
77
78         [HttpPost, ActionName("Delete")]
79         [ValidateAntiForgeryToken]
80         public IActionResult DeleteConfirmed(int id)
81         {
82             Role role = roleRepository.GetRole(id);
83             roleRepository.Delete(id);
84             return RedirectToAction("Index");
85         }
86     }

4.依赖注入

在Startup.cs中,添加注入配置:

        public void ConfigureServices(IServiceCollection services)
        {
            //...

            //依赖注入
            services.AddSingleton<IRoleRepository, RoleRepository>();

            services.AddMvc();
        }

5.小结

下一章再补充工作单元……

时间: 2024-08-28 14:22:58

ASP.NET5+EntityFramework7开发实践(三)的相关文章

ASP.NET5+EntityFramework7开发实践(一)

 1.创建项目 创建“空白解决方案”,名为GiveCase. 在解决方案里,添加ASP.NET5 Empty模板项目,名为GiveCase.Web.  2.实体类 实体基类: 1 /// <summary> 2 /// 实体 抽象基类 3 /// </summary> 4 /// <typeparam name="TKey">主键类型</typeparam> 5 public abstract class EntityBase<TK

ASP.NET5+EntityFramework7(二):前端工具

1.bower (注:本章实践是在ASP.NET5 Empty Web项目中) 添加bower.json后,更改一下载安装包的保存路径,通过.bowerrc这个文件修改为: { "directory": "bower_components" } 然后再修改project.json中: "exclude": [ //...... "bower_components" ], 假如想下载jquery安装包,只需要在bower.jso

Linux下ASP.NET5开发工具与部署环境搭建 (学习笔记)

1.说明 由于在“古董机”上进行实践,只能安装系统是ubuntu-15.04-desktop-i386 (x86 32位桌面系统,建议你装64位的) 本想在此介绍时进行一些截图或录制视频,但对Linux系统操作不是很熟,再加上系统特别“卡”, 连汉字输入都不方便(比如这篇文章敲得费劲呀),实在是杯具,只好放弃! 以下内容,有些啰嗦,抱歉!(其实也是我学习笔记,记详细点,时间长了,不怕忘.) 以下资料来源主要参考:https://docs.asp.net和https://github.com/as

ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章

转自:http://www.cnblogs.com/mzwhj/p/3592895.html 上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东西没有理由不支持. 附件的上传同样基于KindEditor实现,可以上传图片,flash,影音,文件等. 目录 ASP.NET MVC5 网站开发实践 - 概述 ASP.NET MVC5 网站开发实践(一)

ASP.NET5实践01:Web项目创建、结构概述、程序运行、发布部署

1.项目创建 ASP.NET5项目模板有三种: 新建项目: 选择模板: 2.结构概述 References对应配置是project.json中: "frameworks": { "dnx451": { }, "dnxcore50": { } }, ASP.NET5开发时支持多版本的clr共存,但运行时是使用其中一种. dnxcore50是跨平台.模块化的coreclr.它有多种,如:dnx-coreclr-win-*,dnx-coreclr-li

ASP.NET5最佳实践:技术选择+依赖注入+配置文件读写

1.技术选择 页面: html静态页面很好,但模板(代码块)重用怎么办? 再有与后台交互,比如绑定数据又如何办? 模板不能重用,无解.后台交互,无怪乎可以使用js代码.特别现在流行SPA应用,html+angularjs类的框架…… cshtml可以使用Layout页(类似webfroms master模板页),也可以使用ViewsComponets(类似于webfroms web控件) 它使用Razor视图引擎解析,页面甚至可以使用c#语言.和后台交互式很Easy的. 如果说cshtml结构代

ASP.NET-FineUI开发实践-9(四)

现在是这么个问题,在开发中表格是动态出来的,就是标准板是全部字段列出,客户要根据情况列出自己想要的,在增加操作页面的同时要是能用前台自带的功能直接保存到后台就好了,现在的列显示和隐藏是不回发的. 1.FineUI引用的extjs是ext-part1.js,这就不说了,以前截过图,这个文件是压缩的,参数也是简化的不好看,其实这个就是ext-all.js,ext-all哪来的呢,就是extjs官方实例里下的,下来之后也是压缩的,旁边还有个不压缩的,ext-all-debug.js ,完全可以看,那我

asp.net5开发中DNX SDK版本的影响

某次asp.net5开发中遇到了一个很奇怪的问题,引用部分的nuget包没有显示任何错误,如下图: 但是编译时出现了几百个错误: 错误基本都是形如“CS0246 The type or namespace name 'Key' could not be found (are you missing a using directive or an assembly reference?) ”这种错误, 给人的第一感觉就是nuget包引用出了问题,但是不管你怎么检查就是查不出来哪里错了. 更离奇的是

ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. Razor在减少代码冗余.增强代码可读性和Visual Studio智能感知方面,都有着突出的优势.Razor一经推出就深受广大ASP.Net开发者的喜爱. 1.2 Razor的语法 (1)Razor文件类型:Razor支持两种文件类型,分