目录索引 

【无私分享:ASP.NET CORE 项目实战】目录索引

简介

  上一章,我们介绍了安装和新建控制器、视图,这一章我们来创建个数据模型,并且添加接口和实现类。

添加EF上下文对象

  按照我们以前的习惯,我们还是新建几个文件夹

  Commons:存放帮助类

  Domians:数据模型

  Services:接口和实现类

  

我们在Domains文件夹下添加一个类库 Domain

我们新建一个类 ApplicationDbContext 继承 DbContext

 using Microsoft.EntityFrameworkCore;

 namespace Domain
{
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
} protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
}
}

  

  说明:

  DbContext 需要引用 Microsoft.EntityFrameworkCore

  第一种方式:选中 DbContext 通过组合键  Ctrl+. 添加 Microsoft.EntityFrameworkCore 引用

  第二种方式:在Domain 类库的 project.json 中添加 Microsoft.EntityFrameworkCore 引用

  然后,我们打开 \src\Startup.cs 修改 ConfigureServices(IServiceCollection services) 方法,增加对EF的支持(黄色高亮):

  

     // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration); services.AddDbContext<ApplicationDbContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("SqlServerConnection"))); services.AddMvc(); }

  上面的 SqlServerConnection 是我们的数据库连接字符串,它的配置在 \src\appsettings.json 文件中(这个名字让我们想起了appsetting.config):

这样,实际上我们就完成了,但是我们后面会用到,我们目前不操作数据。

添加接口和实现类

  我们来添加一个接口和实现类,来看一下Asp.net Core的依赖注入。

  我们在Services文件夹下添加一个类库 Service

我们在 Service 类库下,新建 三个文件夹:

IDao:存放基础操作类

IService:存放接口文件

ServiceImp:存放实现类

IDao 我们先不管,我们后面 IRepositorycs和Repositorycs(DDD 领域驱动设计) 会使用到,我们主要是添加一个接口和实现类。为了更好的归类接口和实现类,我们在 IService 和 ServiceImp 文件夹下面分别建立一个文件夹 SysManage 用于存放系统管理接口。

我们在 \IService\SysManage\ 下新建一个接口 IUserManage

 namespace Service.IService
{
public interface IUserManage
{
/// <summary>
/// 测试接口
/// </summary>
/// <returns></returns>
string Test();
}
}

  我们在 \ServiceImp\SysManage\ 下新建一个实现类 UserManage

 namespace Service.ServiceImp
{
public class UserManage : IService.IUserManage
{
public string Test()
{
return "我实现了接口方法Test";
}
}
}

   修改 \src\Startu.cs 的 ConfigureServices(IServiceCollection services) 方法,实现注入(黄色高亮):

 // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration); services.AddDbContext<ApplicationDbContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("SqlServerConnection"))); services.AddMvc(); // Add application services.
services.AddTransient<Service.IService.IUserManage, Service.ServiceImp.UserManage>();
}

    说明:

调用接口

  注入有三种方式:构造器注入、属性注入 和 方法注入。我们在  【无私分享:从入门到精通ASP.NET MVC】 系列中大部分使用的是 属性注入,今天我们使用的是 构造器注入:

  我们在 HomeController 中 声明接口

  private readonly IUserManage _UserManage;

  在控制器构造函数中 添加: 

  public HomeController(IUserManage UserManage)
  {
    _UserManage = UserManage;
  }

  依赖注入框架会自动找到 IUserManage 实现类的实例,赋值给该构造函数

  我们在 About 视图中 测试一下:  

  public IActionResult About()
  {
    ViewData["Message"] = _UserManage.Test();

    return View();
  }

  Ctrl+F5 运行一下:

说明注入成功!(在Asp.net Core中,我们修改代码后直接保存刷新页面就可以,不再像以前那样 要重新编译生成,这点还是很赞的。)

三种注入方式:

  构造器注入

  构造器注入就在在构造函数中借助参数将依赖的对象注入到创建的对象之中。如下面的代码片段所示,Foo针对Bar的依赖体现在只读属性Bar上,针对该属性的初始化实现在构造函数中,具体的属性值由构造函数的传入的参数提供。当DI容器通过调用构造函数创建一个Foo对象之前,需要根据当前注册的类型匹配关系以及其他相关的注入信息创建并初始化参数对象。

  1: public class Foo
: {
: public IBar Bar{get; private set;}
: public Foo(IBar bar)
: {
: this.Bar = bar;
: }
: }

除此之外,构造器注入还体现在对构造函数的选择上面。如下面的代码片段所示,Foo类上面定义了两个构造函数,DI容器在创建Foo对象之前首选需要选择一个适合的构造函数。至于目标构造函数如何选择,不同的DI容器可能有不同的策略,比如可以选择参数做多或者最少的,或者可以按照如下所示的方式在目标构造函数上标注一个相关的特性(我们在第一个构造函数上标注了一个InjectionAttribute特性)。

: public class Foo
: {
: public IBar Bar{get; private set;}
: public IBaz Baz {get; private set;}
:
: [Injection]
: public Foo(IBar bar)
: {
: this.Bar = bar;
: }
:
: public Foo(IBar bar, IBaz):this(bar)
: {
: this.Baz = baz;
: }
: }

  属性注入

  如果依赖直接体现为类的某个属性,并且该属性不是只读的,我们可以让DI容器在对象创建之后自动对其进行赋值进而达到依赖自动注入的目的。一般来说,我们在定义这种类型的时候,需要显式将这样的属性标识为需要自动注入的依赖属性,以区别于该类型的其他普通的属性。如下面的代码片段所示,Foo类中定义了两个可读写的公共属性Bar和Baz,我们通过标注InjectionAttribute特性的方式将属性Baz设置为自动注入的依赖属性。对于由DI容器提供的Foo对象,它的Baz属性将会自动被初始化。

  : public class Foo
: {
: public IBar Bar{get; set;}
:
: [Injection]
: public IBaz Baz {get; set;}
: }

  方法注入

  体现依赖关系的字段或者属性可以通过方法的形式初始化。如下面的代码片段所示,Foo针对Bar的依赖体现在只读属性上,针对该属性的初始化实现在Initialize方法中,具体的属性值由构造函数的传入的参数提供。我们同样通过标注特性(InjectionAttribute)的方式将该方法标识为注入方法。DI容器在调用构造函数创建一个Foo对象之后,它会自动调用这个Initialize方法对只读属性Bar进行赋值。在调用该方法之前,DI容器会根据预先注册的类型映射和其他相关的注入信息初始化该方法的参数。

   : public class Foo
: {
: public IBar Bar{get; private set;}
:
: [Injection]
: public Initialize(IBar bar)
: {
: this.Bar = bar;
: }
: }

希望跟大家一起学习Asp.net Core

刚开始接触,水平有限,很多东西都是自己的理解和翻阅网上大神的资料,如果有不对的地方和不理解的地方,希望大家指正!

虽然Asp.net Core 现在很火热,但是网上的很多资料都是前篇一律的复制,所以有很多问题我也暂时没有解决,希望大家能共同帮助一下!

原创文章 转载请尊重劳动成果 http://yuangang.cnblogs.com

【无私分享:ASP.NET CORE 项目实战(第二章)】添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)的更多相关文章

  1. 【无私分享:ASP.NET CORE 项目实战】目录索引

    简介 首先,我们的  [无私分享:从入门到精通ASP.NET MVC]   系列已经接近尾声,希望大家在这个过程中学到了一些思路和方法,而不仅仅是源码. 因为是第一次写博客,我感觉还是比较混乱的,其中 ...

  2. 【无私分享:ASP.NET CORE 项目实战(第十三章)】Asp.net Core 使用MyCat分布式数据库,实现读写分离

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 MyCat2.0版本很快就发布了,关于MyCat的动态和一些问题,大家可以加一下MyCat的官方QQ群:106088787.我 ...

  3. 【无私分享:ASP.NET CORE 项目实战(第六章)】读取配置文件(一) appsettings.json

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在我们之前的Asp.net mvc 开发中,一提到配置文件,我们不由的想到 web.config 和 app.config,在 ...

  4. 【无私分享:ASP.NET CORE 项目实战(第五章)】Repository仓储 UnitofWork

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 本章我们来创建仓储类Repository 并且引入 UnitOfWork 我对UnitOfWork的一些理解  UnitOfW ...

  5. 【无私分享:ASP.NET CORE 项目实战(第四章)】Code First 创建数据库和数据表

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 本章我们来介绍下Asp.net Core 使用 CodeFirst 创建数据库和表,通过 控制台 和 dotnet ef 两种 ...

  6. 【无私分享:ASP.NET CORE 项目实战(第十四章)】图形验证码的实现

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 很长时间没有来更新博客了,一是,最近有些忙,二是,Core也是一直在摸索中,其实已经完成了一个框架了,并且正在准备在生产环境中 ...

  7. 【无私分享:ASP.NET CORE 项目实战(第十二章)】添加对SqlServer、MySql、Oracle的支持

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 增加对多数据库的支持,并不是意味着同时对多种数据库操作,当然,后面,我们会尝试同时对多种数据库操作,这可能需要多个上下文,暂且 ...

  8. 【无私分享:ASP.NET CORE 项目实战(第十一章)】Asp.net Core 缓存 MemoryCache 和 Redis

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 经过 N 久反复的尝试,翻阅了网上无数的资料,GitHub上下载了十几个源码参考, Memory 和 Redis 终于写出一个 ...

  9. 【无私分享:ASP.NET CORE 项目实战(第十章)】发布项目到 Linux 上运行 Core 项目

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下 ...

随机推荐

  1. 读python源码--对象模型

    学python的人都知道,python中一切皆是对象,如class生成的对象是对象,class本身也是对象,int是对象,str是对象,dict是对象....所以,我很好奇,python是怎样实现这些 ...

  2. Android带加减的edittext

    看了网上这样自带加减的edittext写得好复杂,还有各种监听事件,我觉得没有必有.于是我自己写了一个. 我这个edittext仅仅限制整数,每次加减1. public class TestEditT ...

  3. 来吧,HTML5之一些注意事项

    1.说什么是HTML HTML是一种超文本标记语言(Hyper Text Markup Language), 标记语言是一套标记标签(markup tag),用来描述网页的非编程语言. 2.标签特性: ...

  4. 开发者的利器:Docker 理解与使用

    困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...

  5. 微信小程序开发日记——高仿知乎日报(中)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...

  6. [原创]Macbook Pro Retina 15吋安装Windows 7和Windows 8.1方法

    前言 本以为有Bootcamp神器在手,Macbook装Win系统应该是不在话下,没想到着实折腾了一番.期间因为误操作导致OSX也挂掉进不去只得磁盘全部抹掉网络恢复安装.为了让大家少走弯路,提供个人安 ...

  7. 整体二分QAQ

    POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...

  8. ASP.NET Aries JSAPI 文档说明:AR.DataGrid

    AR.DataGrid 文档 用法: <body> <table id="dg"></table> </body> </htm ...

  9. 用Taurus.MVC 做个企业站(下)

    前言: 上一篇完成了首页,这一篇就把剩下的几个功能给作了吧. 包括文章列表.文章详情和产品展示. 1:文章列表: 原来的ArticleList.aspx 1:现在的articlelist.html 除 ...

  10. Dijkstra 单源最短路径算法

    Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...