.NETCore_初探
1. Core默认的服务注册
Statup文件(rogram类型中创建 WebHost时使用的)中有俩个方法:
Configure和ConfigureServices(将服务放置到容器里面)
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IService,Service>();
services.AddTransient<IOperationTransient,Operation>();
services.AddSingleton<IOperationSingleton,Operation>();
}
2. 使用第三方依赖注入容器
.net Core 默认的容器只提供构造函数注入功能
将默认容器替换成其他容器仅需三步:
1. 将ConfigureServices方法的返回值改为IServiceProvider
2. 将Asp.Net Core的服务注册到第三方容器中
3. 使用第三方容器实现IServiceProvider接口并返回
注:使用第三方容器必须将Controller注册为服务
如果当容器变更为其它容器,并且使用了容器提供的如属性注入等功能时,如果没有将Controller注册为服务,那么相应的属性注入的过程也不会被触发,简单来说就是只有将Controller注册为服务,那么实例化Controller的工作才会由容器完成,才会触发或者使用到容器提供的其它特性。
services.AddMvc()
AddControllersAsServices()
SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
3. 服务的获取
参考:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-2.1
1. Controller构造方法参数
2. 通过Controller注入IServiceProvider类型,通过IServiceProvider来获取服务
public HomeController(IServiceProvider serviceProvider)
{
var configuration = (IConfiguration)serviceProvider.GetServie(typeof(IConfiguration));
}
3. 在Action方法或者Mvc过滤器(过滤器的上下文参数中包含HttpContext)中通过HttpContext的RequestServices对象获取服务
Public IActionResult Index()
{
var configuration = (IConfiguration)this.HttpContext.RequestServices.GetService(typeof(IConfiguration));
}
4. 在View使用@inject注入服务
@using Microsoft.Extensions.Configuration;
@inject IConfiguration configuration;
5. 在Action方法中,通过FormServices特性注入服务
public IActionResult Index([FromServices] IConfiguration configuration)
{
return this.View();
}
注:一般来说尽可能显式的标明类型的依赖(即通过构造参数的方式声明当前类型所依赖的组件)
常用的服务
1. IHostingEnvironment 包含环境名称,应用名称,当前程序根目录,以及wwwroot的根目录
2. IHttpContextAccessor 当前请求的HttpContext
3. IConfiguration 配置信息对象(不建议使用这个对象读取配置文件,使用Options)
4. IServiceProvider 服务提高器
5. DbContext EFCore的DbContext也是在ConfigureServices中进行服务注入(避免与Controller直接产生依赖关系)
Configure方法之.NET Core请求管道的建立
.NET Core基于Startup类型的Configure方法建立管道,通过IApplicationBulider实例添加不同功能的中间件,通过中间件的串联形成管道
参考:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/index?view=aspnetcore-2.1
public void Configure(IApplicationBuilder app,IHostingEnvironment env)
{
if(env.IsDevelopment())
{//开发环境显示异常信息中间件
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}else
{//其他环境跳转错误页面中间件
app.UseExceptionHandler("/Error");
}
//默认的无参UseStaticFiles方法将wwwroot目录作为静态资源存放目录,静态文件处理中间件
app.UseStaticFiles();
//如果要添加其它静态内容目录可以再次使用UseStaticFiles方法,并通过StaticFileOptions对目录的访问路径以及实际路径进行配置
app.UseStaticFiles(new StaticFileOptions{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(),"Core")),
RequestPath ="/Core"
});
//注:Windows和Linux类系统的路径分隔符也不一致,所以为了保证路径的统一,可以使用Path.Combine方法,该方法会根据操作系统的不同对路径进行不同的处理
app.UseMvc(rotes =>
{//Mvc中间件
rotes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}"
);
});
}
.NET Core Mvc
1. 路由 将请求的Url映射到路由模板进行匹配,例如:
//携带Area的路由模板必须放在前面,否则产生的地址则是:/Controller/Action?Area=area ASP.NET Core会将多余的路由参数放置到查询字符串中
rotes.MapRoute(
name: "areas",
template: "{area:exists}/{controller = Home}/{action=Index}/{id?}"
);
rotes.MapRoute(
name: "default",
template: "{controller = Home}/{action=Index}/{id?}"
);
routes.MapRoute(
name: "us_default",
template: "en-us/Home/{id}",
deatults: new { controller = "Home", action ="Index" },// 路由默认值
constraints: new { id = new IntRouteConstraint() }, //路由参数约束
dataTokens: new { locale ="en-us" } //附加数据
);
2. 路由除了处理Url请求匹配,还可以链接生成的功能,在View使用
参考:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-2.1
<a asp-area="" asp-controller="Home" asp-action="Index">Home</a>
3. Area下面的Controller需要使用特性标记当前的Controller属于哪个Area;
[Area("SysManger")]
public class HomeController : Controller
{
...
4. View
Razor参考:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/razor?view=aspnetcore-2.1
TagHelper参考:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro?view=aspnetcore-2.1
Core可以在ConfigureServices方法中对RazorViewEngieOptions进行配置
services.Configure<RazorViewEngineOptions>(options =>
{
//添加View的查找路径
options.ViewLocationFormats.Add("/Common/View/{1}/{0}.cshtml");
//添加AreaView的查找路径
options.AreaViewLocationFormats.Add("/Test/{2}/View/{1}/{0}.cshtml");
});
5. Action的返回值与Json序列化
使用Json方法返回一个对象实例,使用首字母大写(WebApi的OK方法和Signalr的Json格式相同问题)
public IActionResult GetObj()
{
return Json(new { code=0, Msg ="1"})
}
要使用"Msg"首字母大写命名需要配置Mvc服务添加以下代码修改Json默认的序列号配置:
services.AddMvc()
.AddJsonOptions(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
.NETCore_初探的更多相关文章
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- JavaScript学习(一) —— 环境搭建与JavaScript初探
1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...
- .NET文件并发与RabbitMQ(初探RabbitMQ)
本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...
- React Native初探
前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...
- 【手把手教你全文检索】Apache Lucene初探
PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...
随机推荐
- 分享MYSQL中的各种高可用技术
分享MYSQL中的各种高可用技术 图片和资料来源于姜承尧老师(MYSQL技术内幕作者) mysql高可用各个技术的比较 数据库的可靠指的是数据可靠 数据库可用指的是数据库服务可用 可靠的是数据:例如工 ...
- [20180319]直接路径读特例12c.txt
[20180319]直接路径读特例12c.txt --//昨天的测试突然想起以前遇到的直接路径读特例,在12c重复测试看看. 1.环境:SCOTT@test01p> @ ver1 PORT_ST ...
- python第五十一天----线程,Event,队列
进程与线程的区别: 线程==指令集,进程==资源集 (线程集) 1.同一个进程中的线程共享内存空间,进程与进程之间是独立的 2.同一个进程中的线程是可以直接通讯交流的,进程与间通讯必需通过一个中间的 ...
- rbac models
class Permission(models.Model): """ 权限表 """ perm_name = models.CharFie ...
- python socket 套接字编程 单进程服务器 实现多客户端访问
服务器: import socket #单进程服务器 实现多客户端访问 IO复用 #吧所有的客户端套接字 放在一个列表里面,一次又一次的便利过滤 server = socket.socket(sock ...
- [转]extern "C"的作用
extern "C"的主要作用就是为了能够正确实现C++代码调用其它C语言代码. 加上extern “C”后,会指示编译器将这部分代码按C语言进行编译,而不是C++的.这是因为C+ ...
- 使用sstream来进行类型转换
在某种情况下,我们不得不进行整型等数据类型与字符串类型的转换,比如,将“1234”转换为整数,常规的我们可以使用atoi函数来进行转换,或者是写一个循环来做转换,我们在这里也可以使用sstream类来 ...
- 第 16 章 C 预处理器和 C 库(直角坐标转换极坐标)
/*------------------------------------- rect_pol.c -- 把直角坐标转换为极坐标 ---------------------------------- ...
- 改变javascript函数内部this指针指向的三种方法
在查了大量的资料后,我总结了下面的三条规则,这三条规则,已经可以解决目前我所遇到的所有问题.规则0:函数本身是一个特殊类型,大多数时候,可以认为是一个变量. function a() { alert( ...
- 用Promise解决多个异步Ajax请求导致的代码嵌套问题【转】
问题 前端小同学在做页面的时候,犯了个常见的错误:把多个Ajax请求顺序着写下来了,而后面的请求,对前面请求的返回结果,是有依赖的.如下面的代码所示: var someData; $.ajax({ u ...