精华内容
下载资源
问答
  • .NET Core开发实战

    2021-04-15 02:06:22
    在 ASP.NET Core 3.1 中,使用新的组件标记帮助程序从页面或视图呈现组件:download:.NET Core开发实战 CSHTML 复制 HTML 帮助程序在 ASP.NET Core 3.1 仍受支持,但建议使用组件标记帮助程序。 Blazor Server ...

    在 ASP.NET Core 3.0 的 Blazor 中,使用 HTML 帮助程序 (Html.RenderComponentAsync) 将组件呈现到页面和视图中。 在 ASP.NET Core 3.1 中,使用新的组件标记帮助程序从页面或视图呈现组件:download:.NET Core开发实战
    CSHTML

    复制

    HTML 帮助程序在 ASP.NET Core 3.1 仍受支持,但建议使用组件标记帮助程序。
    Blazor Server 应用现可在初始呈现期间将参数传递给顶级组件。 之前,你只能将参数传递给具有 RenderMode.Static 的顶级组件。 在此版本中,RenderMode.Server 和 RenderMode.ServerPrerendered 均受支持。 任何指定的参数值均序列化为 JSON,并包含在初始响应中。
    例如,通过增量 (IncrementAmount) 预呈现一个 Counter 组件:
    CSHTML

    复制

    <component type="typeof(Counter)" render-mode="ServerPrerendered" 
        param-IncrementAmount="10" />
    

    有关详细信息,请参阅将组件集成到 Razor Pages 和 MVC 应用。
    HTTP.sys 中对共享队列的支持
    HTTP.sys 支持创建匿名请求队列。 在 ASP.NET Core 3.1 中,我们添加了创建 HTTP.sys 请求队列或附加到现有 HTTP.sys 请求队列的功能。 通过创建名为 HTTP.sys 的请求队列或附加到现有 HTTP.sys 请求队列,可实现拥有该队列的 HTTP.sys 控制器进程独立于侦听器进程这一场景。 利用这种独立性,可在侦听器进程重启期间保留现有的连接和排队的请求:
    C#

    复制

    public static IHostBuilder CreateHostBuilder(string[] args) =>
         Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                // ...
                webBuilder.UseHttpSys(options =>
                {
                    options.RequestQueueName = "MyExistingQueue";
                    options.RequestQueueMode = RequestQueueMode.CreateOrAttach;
                });
            });
    

    SameSite cookie 的中断性变更
    SameSite cookie 的行为已更改,可反映出即将发生的浏览器更改。 这可能会影响 AzureAd、OpenIdConnect 或 WsFederation 等身份验证场景。 有关详细信息,请参阅 使用 cookie ASP.NET Core 中的 SameSite。
    在 Blazor 应用中阻止事件的默认操作
    使用 @on{EVENT}:preventDefault 指令属性可阻止事件的默认操作。 在下例中,阻止在文本框中显示键字符的默认操作:
    razor

    复制
    <input value="@_count" @οnkeypress=“KeyHandler” @onkeypress:preventDefault />
    有关详细信息,请参阅阻止默认操作。
    在 Blazor 应用中停止事件传播
    使用 @on{EVENT}:stopPropagation 指令属性来停止事件传播。 在下例中,选中复选框可阻止子

    中的单击事件传播到父

    razor

    复制

    <input @bind="_stopPropagation" type="checkbox" />
    
    <div @onclick="OnSelectParentDiv">
        <div @onclick="OnSelectChildDiv" @onclick:stopPropagation="_stopPropagation">
            ...
        </div>
    </div>
    
    @code {
        private bool _stopPropagation = false;
    }
    

    有关详细信息,请参阅停止事件传播。

    展开全文
  • Vue+ASP.NET Core开发实战

    2021-03-25 14:44:13
    本项目为全栈完整实战项目,从前端到后端到数据库一站式打通,可能是最全最细的零基础实战教学,前端HTML/JS/CSS/Vue/ElementUI/.NET5 WebAPI/MVC/ADO.NET/EF Core,数据库使用SQLServer2019。带着大家一个项目从...
  • .NET Core开发实战(第9课:命令行配置提供程序)--学习笔记.pdf
  • 《ASP.NET Core 开发实战》 ========== ========== ========== [作者] (意) Dino Esposito [译者] (中) 赵利通 [出版] 清华大学出版社 [版次] 2019年07月 第1版 [印次] 2019年12月 第2次 印刷 [定价] 79.80元 =====...

    《ASP.NET Core 开发实战》

    ========== ========== ==========
    [作者] (意) Dino Esposito
    [译者] (中) 赵利通
    [出版] 清华大学出版社
    [版次] 2019年07月 第1版
    [印次] 2019年12月 第2次 印刷
    [定价] 79.80元
    ========== ========== ==========

    【前言】 

    (PVI) 

    ASP.NET Core 是 ASP.NET 开发人员需要了解的一种技术,是在多种平台上进行 Web 开发时可供使用的另一种全栈解决方案。

    【第01章】 

    (P006) 

    对于处理必须返回 HTML 内容的 Web 请求, ASP.NET MVC 编程模型是最灵活、最容易理解的方式。

    (P008) 

    .NET Core Framework 主要被设计为用于 ASP.NET 应用程序。

    .NET Core Framework 只能用来编写 ASP.NET 和控制台应用程序。

    .NET Core Framework 可与应用程序一同部署,而完整的 .NET Framework 只能安装到目标机器上,由所有应用程序共享。

    (P009) 

    .NET Core Framework 是从头开始重新设计的一个新框架,看上去与完整的 .NET Framework 很类似,但是能够跨平台工作。

    (P010) 

    ASP.NET Core 包含一个内置的 Web 服务器和一个运行应用程序代码的运行时环境。

    【第02章】 

    (P015) 

    ASP.NET Core 有一个全新的运行时环境,只支持一种应用模型 : ASP.NET MVC 。

    (P018) 

    一般来说, Web 根文件夹是内容根文件夹的子文件夹,被命名为 wwwroot 。

    (P019) 

    ASP.NET Core 应用程序需要在一个宿主中执行。宿主负责该应用程序的启动和生命周期管理。

    (P021) 

    事实上, Configure 和 ConfigureServices 方法都是通过反射来发现并调用的。

    (P026) 

    管道由中间件组件构成,这些组件在 Configure 中注册,对于每个请求,按照注册的顺序调用它们。

    (P032) 

    服务定位器模式更容易添加到现有框架中。依赖注入模式则是从头构建的框架的理想选择。

    ASP.NET Core 中的 DI 框架并不是完善的 DI 框架,无法与业界顶尖的框架一争。它只是做一些基本的任务,但做得很好,能满足 ASP.NET Core 平台的需要。

    (P033) 

    需要重点注意,在 ConfigureServices 中可以注册外部 DI 框架。不过,在注册时,必须在启动类中把方法的返回类型从 void 改为 IServiceProvider 。

    只有少数的 DI 框架被移植到了 .NET Core 中,其中包括 Autofac 和 StructureMap 。

    要让自定义代码在经典 ASP.NET 中运行,最快捷的方法是使用 HTTP 处理程序。

    【第03章】 

    (P053) 

    在经典 ASP.NET MVC 中,如果没有找到与 URL 匹配的路由,将得到 HTTP 404 状态码。但是,在 ASP.NET Core 中,任何终止中间件都将有机会来处理请求。

    【第04章】 

    (P067) 

    控制器管理着请求的整个处理过程。

    编写控制器类的步骤可总结为两个 : 实现一个类,然后在该类中添加一些公有方法,在运行时该类可以作为控制器被发现,而这些方法则可作为操作被发现。

    (P068) 

    MVC 应用程序收到的只是一个待处理的 URL ,这个 URL 必须以某种方式映射到一个控制器类和一个公有方法。

    (P069) 

    传统路由和特性路由并不是互斥的。二者可用在同一个应用程序中。

    特性路由始终是打开的,导致通过特性定义的路由比传统路由的优先级更高。

    只要控制器类的名称带有 Controller 后缀,并且继承自 Controller 基类,就可以被系统发现。

    (P070) 

    操作调用程序将 HTTP 上下文注入控制器实例,在控制器类内运行的代码可通过 HttpContext 属性方便地访问 HTTP 上下文。

    (P073) 

    ASP.NET Core 提供了内置的依赖注入 (DI) 框架,开发人员可通过这个框架来注册抽象类型 (如接口) 及其具体类型,在请求抽象类型的引用时,返回该抽象类型的具体类型实例的工作则由框架来完成。

    (P075) 

    在 Web 上,当点击链接或者在地址栏中输入 URL 时,是在执行 HTTP GET 命令。当提交 HTML 表单的内容时,是在执行 HTTP POST 命令。

    (P080) 

    控制器操作方法能够访问 HTTP 请求传递的任何输入数据。

    (P081) 

    编写操作方法体时,可以直接访问熟悉的 Request 对象及其子类集合 (如 Form 、 Cookies 、 Query 和 Headers) 提交的任何输入数据。

    Request.Query 字典包含从 URL 的查询字符串提取的参数及其对应值的一个列表。注意,在搜索匹配项时,不考虑大小写。

    (P082) 

    模型绑定器按精确的顺序将参数与传入的数据匹配起来。它首先检查是否能够在路由参数上找到匹配,然后检查表单提交的数据,最后检查查询字符串数据。

    (P083) 

    默认绑定器能够映射所有的基本类型,如 string 、 int 、 double 、 decimal 、 bool 和 DateTime ,以及这些类型的相关集合。

    (P085) 

    模型绑定器会寻找键名称与属性名称匹配的提交值。这种匹配是不区分大小写的。

    (P090) 

    在 ASP.NET Core 中, Web API 框架 (包括其自己的控制器服务和操作结果类型) 已被集成到主框架中。

    【第05章】 

    (P099) 

    从架构的角度来看,返回 HTML 标记的请求与返回纯本文或 JSON 数据的请求并没有区别。

    (P101) 

    调用 View 函数将触发视图引擎,返回一个对象,该对象封装了要使用的 Razor 模板文件 (一个扩展名为 .cshtml 的文件) 的名称和一个视图模型对象,后者包含了要在最终的 HTML 布局中显示的数据。

    (P102) 

    视图引擎是 MVC 应用程序模型的核心组件,负责从视图创建 HTML 。

    在控制器方法内,通过调用 View 方法来调用视图引擎。

    母版页视图默认为一个名为 _Layout.cshtml 的 Razor 文件,其 HTML 布局是视图的基础。

    (P104) 

    在 ASP.NET Core 中,每个应用程序只有一个默认的视图引擎 : RazorViewEngine 类。

    除了使用 ASP.NET Core 提供的 RazorViewEngine 类,也可以基于自定义语法来实现自己的视图引擎。

    (P105) 

    使用区域就像是使用多个子应用程序,是将较大的应用程序分区成较小的片段的一种方法。

    使用区域时,他们会对路由产生影响。在传统路由中,区域的名称是另一个要考虑的参数。

    (P110) 

    Razor 模板文件实际上就是 HTML 模板,其中穿插了一些用 C# 语言 (或者 ASP.NET Core 平台支持的其他任何语言) 编写的代码块。

    @符号告诉解析器,在这个位置将发生静态内容到代码段的过渡。

    (P112) 

    当多个 Razor 文件起作用时,编译过程将分步骤进行。首先处理布局模板,然后是 _ViewStart 和实际的视图。之后合并输出,这样 _ViewStart 中的公共代码将在视图之前渲染,而视图则在布局内输出其内容。

    (P113) 

    控制器向视图传递数据时,最简单的方法是将信息存入一个 名称 / 值 字典中。

    (P115) 

    对于使用 ViewData 这样弱类型的字典,最有说服力的理由是在编程时,它们使用起来简单快捷。

    (P116) 

    一般来说,在向视图传递数据时,强类型视图模型是优先选择的方法。

    视图模型类完全代表了要渲染到视图的数据。类的结构应该尽可能与视图的结构匹配。

    (P117) 

    一般来说,应该努力让每个 Razor 视图模型有一个专门的视图模型类。

    可以接受把实体模型直接传递给视图的唯一一种情况是确实有一个 CRUD 视图的时候。但是,坦白讲,纯粹的 CRUD 视图如今只存在于教程和总结文章中。

    (P118) 

    在 ASP.NET 中,可以将 DI 系统中注册的任何类型的实例注入视图中。这是通过 @inject 指令实现的。

    ViewData 字典和 @inject 指令结合起来时,为从 Razor 视图中获取需要使用的任何数据提供了一种强大的、极为快速的方法。

    (P119) 

    Razor 页面就像一个无布局的 Razor 视图,但是它们使用的根指令是 @page 。Razor 页面完整支持 Razor 语法,包括 @inject 指令和 C# 语言。

    (P120) 

    需要注意, @page 指令会影响其他支持的指令的行为,所以必须是页面中的第一条 Razor 指令。

    不能将 Razor 页面放到 Pages 文件夹之外。

    【第06章】 

    (P123) 

    Razor 文件是一个文本文件,包含两个主要的语法项 : HTML 表达式和代码表达式。

    (P124) 

    无论选择什么编程语言,@ 字符总是表明 Razor 代码表达式的开始位置。

    (P126) 

    HTML 帮助程序是 HtmlHelper 类的一个扩展方法。抽象来讲, HTML 帮助程序只不过是一个 HTML 工厂。

    (P127) 

    xxxFor 帮助程序与基础版本的区别在于,它只接受一个 Lambda 函数作为参数。

    当用来填充视图的数据被分组到一个模型对象中时, xxFor 版本特别有用。

    (P128) 

    在 Razor 中,布局模板扮演了母版页的角色。布局模板定义了视图引擎在任何映射的视图中渲染的骨架,使得网站的对应部分有了一致的外观和感觉。

    布局模板是一个完整的 HTML 模板,以 <html> 开头,以 </html>

    展开全文
  • 前言极客时间上的《.NET Core开发实战》是一门非常好的课程,作者肖伟宇在第31课(https://time.geekbang.org/course/detail/100044601-...

    前言

    极客时间上的《.NET Core开发实战》是一门非常好的课程,作者肖伟宇在第31课(https://time.geekbang.org/course/detail/100044601-201165)介绍了定义API的最佳实践

    大意如下:

    Controller这一层负责与前端用户的交互,它主要的责任就是定义输入和输出,不应该处理业务。 

    因此使用中介者模式,将业务逻辑和Controller进行隔离。

    示例API的实现代码如下:

    [Route("api/[controller]")]
    [ApiController]
    public class OrderController : ControllerBase
    {
        IMediator _mediator;
        public OrderController(IMediator mediator)
        {
            _mediator = mediator;
        }
    
        [HttpPost]
        public async Task<long> CreateOrder([FromBody]CreateOrderCommand cmd)
        {
            return await _mediator.Send(cmd, HttpContext.RequestAborted);
        }
    
        [HttpGet]
        public async Task<List<string>> QueryOrder([FromQuery]MyOrderQuery myOrderQuery)
        {
            return await _mediator.Send(myOrderQuery);
        }
    }
    
    public class CreateOrderCommand : IRequest<long>
    {
        public CreateOrderCommand(int itemCount)
        {
            ItemCount = itemCount;
        }
    
        public long ItemCount { get; private set; }
    }
    
    public class MyOrderQuery : IRequest<List<string>>
    {
        public string UserName { get; set; }
    }
    

    问题

    按照上述的最佳实践去编写Controller,这就意味着,如果有100个命令和查询,就要创建100个同样格式的方法。

    这是一项重复并且枯燥的工作,而且还必须保证方法返回值与IRequest<T>的类型一致,很容易出错。

    有不有不用写这些代码的简单方式

    Source Generators

    现在,可以祭出我们的大杀器——Source Generators

    上次我们已经使用它实现了AutoMapper,它的主要特点是自动生成源代码并编译到最终输出中。

    这次,我们用它来自动生成API代码。

    实现原理如下:

    • 遍历所有继承IRequest<T>的类,并用它们名称的第2个单词(例如Order)分组

    • 分组Key作为Controller的名称

    • 在Controller分组中遍历分组下的类,生成对应命令和查询方法

    具体实现代码请到https://github.com/feiyun0112/CodesForMy_IO下载。

    使用示例

    下载课件代码(https://gitee.com/geektime-geekbang/NET-Core),在GeekTime.Ordering.API项目中引用ApiControllerGenerator项目,无需修改任何代码,直接编译,可以看到已经按照最佳实践的规范生成了代码(Controller名称故意加了New以示区别):

    运行后Swagger显示正常,成功!

    结论

    现在,我们只需定义命令和查询,即可实现定义API的最佳实践,是不是很酷!

    如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!

    展开全文
  • ASP.NET Core 启动过程

    ASP.NET Core 启动过程

    1. .Net Core 3.1
    2. VS 2019

    创建一个新的ASP.NET Core Web API应用程序
    在项目目录中有两个关键类 Program.cs 和 Startup.cs

    public class Program
        {
            public static void Main(string[] args)
            {
                CreateHostBuilder(args).Build().Run();
            }
    
            public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    });
        }
    

    在Program.cs 的Main函数 调用 CreateHostBuilder 这个方法
    CreateHostBuilder 返回一个 IHostBuilder
    IHostBuilder 是我们应用程序启动的核心接口

    public interface IHostBuilder
        {
            IDictionary<object, object> Properties { get; }
            
            IHost Build();
            
            IHostBuilder ConfigureAppConfiguration(Action<HostBuilderContext, IConfigurationBuilder> configureDelegate);
            
            IHostBuilder ConfigureContainer<TContainerBuilder>(Action<HostBuilderContext, TContainerBuilder> configureDelegate);
          
            IHostBuilder ConfigureHostConfiguration(Action<IConfigurationBuilder> configureDelegate);
          
            IHostBuilder ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate);
            
            IHostBuilder UseServiceProviderFactory<TContainerBuilder>(IServiceProviderFactory<TContainerBuilder> factory);
           
            IHostBuilder UseServiceProviderFactory<TContainerBuilder>(Func<HostBuilderContext, IServiceProviderFactory<TContainerBuilder>> factory);
        }
    

    这个接口主要有以上6个方法
    我们需要关注的是:

    1. ConfigureAppConfiguration
    2. ConfigureHostConfiguration
    3. ConfigureServices
      这三个方法
      通过修改Program 和 Startup 来演示启动过程
     public static IHostBuilder CreateHostBuilder(string[] args) =>
               Host.CreateDefaultBuilder(args)
                   .ConfigureAppConfiguration(builder => {
                       Console.WriteLine("ConfigureAppConfiguration");
                   })
                   .ConfigureServices(service => {
                       Console.WriteLine("ConfigureServices");
                   })
                   .ConfigureHostConfiguration(builder => {
                       Console.WriteLine("ConfigureHostConfiguration");
                   })
                   .ConfigureWebHostDefaults(webBuilder =>
                   {
                       Console.WriteLine("ConfigureWebHostDefaults");
                       webBuilder.UseStartup<Startup>();
                   });
    

    修改Startup类

    public class Startup
       {
           public Startup(IConfiguration configuration)
           {
               Console.WriteLine("Startup");
               // snip
           }
    
           public IConfiguration Configuration { get; }
    
           // This method gets called by the runtime. Use this method to add services to the container.
           public void ConfigureServices(IServiceCollection services)
           {
               Console.WriteLine("Startup.ConfigureServices");
               // snip
           }
    
           // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
           public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
           {
               Console.WriteLine("Startup.Configure");
                // snip
           }
       }
    

    查看输出结果

    ConfigureWebHostDefaults
    ConfigureHostConfiguration
    ConfigureAppConfiguration
    ConfigureServices
    Startup
    Startup.ConfigureServices
    Startup.Configure
    

    接下来调整一下CreateHostBuilder 中注册顺序

    public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        Console.WriteLine("ConfigureWebHostDefaults");
                        webBuilder.UseStartup<Startup>();
                    })
                    .ConfigureServices(service => {
                        Console.WriteLine("ConfigureServices");
                    })
                    .ConfigureAppConfiguration(builder => {
                        Console.WriteLine("ConfigureAppConfiguration");
                    })
                    .ConfigureHostConfiguration(builder => {
                        Console.WriteLine("ConfigureHostConfiguration");
                    });
    

    然后重新执行查看结果

    ConfigureWebHostDefaults
    ConfigureHostConfiguration
    ConfigureAppConfiguration
    Startup
    Startup.ConfigureServices
    ConfigureServices
    Startup.Configure
    

    发现两次执行的结构有所不同,这个和委托注册进去的顺序有关系,实际上是按照一定的顺序执行的;
    整个启动过程分5个阶段:

    1. ConfigureWebHostDefaults: 这个阶段注册了我们应用程序必要的几个组件,比如配置的组件,容器的组件
    2. ConfigureHostConfiguration:是用来配置我们应用程序启动时必要的配置,比如应用程序启动时需要监听的端口,URL地址等,在这个过程可以嵌入一些自己配置的类容,注入到配置的框架中
    3. ConfigureAppConfiguration:用于嵌入自己的配置文件供应用程序读取,这些配置将会在后续的应用程序执行过程中间每个组件读取
    4. ConfigureServices, ConfigureLogging, Startup, Startup.ConfigureServices:都是用来往容器里面注入我们的应用组件
    5. Startup.Configure:用来注入中间件,处理 HttpContext 整个请求过程

    在整个启动过程中,Startup 这个类不是必要的.只是这样让代码结构更加合理

    public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        Console.WriteLine("ConfigureWebHostDefaults");
    
                        webBuilder.ConfigureServices(services =>
                        {
                            Console.WriteLine("webBuilder.ConfigureServices");
                            services.AddControllers();
                        });
    
    
                        webBuilder.Configure(app => {
                            Console.WriteLine("webBuilder.Configure");
                            
                            app.UseHttpsRedirection();
    
                            app.UseRouting();
    
                            app.UseAuthorization();
    
                            app.UseEndpoints(endpoints =>
                            {
                                endpoints.MapControllers();
                            });
                        });
                    })
                    .ConfigureServices(service => {
                        Console.WriteLine("ConfigureServices");
                    })
                    .ConfigureAppConfiguration(builder => {
                        Console.WriteLine("ConfigureAppConfiguration");
                    })
                    .ConfigureHostConfiguration(builder => {
                        Console.WriteLine("ConfigureHostConfiguration");
                    });
    

    运行得到的结果

    ConfigureWebHostDefaults
    ConfigureHostConfiguration
    ConfigureAppConfiguration
    webBuilder.ConfigureServices
    ConfigureServices
    webBuilder.Configure
    

    与之前执行的顺序也是一致的.

    服务注册一般放在 Startup 的 ConfigureServices,一般是services.AddXXX
    中间件的注册一般放在 Startup 的 Configure 一般是 app.UseXXX

    展开全文
  • .NET Core开发实战(第19课:日志作用域:解决不同请求之间的日志干扰)--学习笔记....pdf
  • .NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(上)....pdf
  • .NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(上)....pdf
  • 04 | Startup:掌握ASP.NET Core的启动过程新建一个 ASP.NET Core Web 应用程序选择 APIpublic class Program { pu...
  • 什么是依赖注入 依赖注入,英文是Dependency Injection一般简称DI,是实现对象与其协作者或依赖关系之间松散耦合的技术。为了执行其操作,类所需要的对象不是直接实例化协作者或使用静态引用...ASP.NET Core 在整个架构
  • 什么情况下需要引入第三方容器组件? 实际上是大部分情况默认的容器组件是够我们使用的,当我们需要一些特殊的场景比如: 基于名称的注入:我们需要按照名称....Net Core 的依赖注入框架的核心扩展点 public int...
  • 12 | 配置变更监听:配置热更新能力的核心这一节讲解如何使用代码来监视配置变化并做出一些动作当我们需要追踪配置发生的变化,可以在变化发生时执行一些特定的操作配置主要提供了一个 GetR...
  • --version 显示使用中的 .NET Core SDK 版本。 这里可以看到 options 支持双横杠长命名和单横杠的短命名 实际上最典型的场景就是给应用的命令行参数提供了一个短命名快捷命名的方式,比如说 -h 就可以替换 --help ...
  • 11 | 文件配置提供程序:自由选择配置的格式文件配置提供程序Microsoft.Extensions.Configuration.IniMicrosoft.Extensions.Con...
  • 3、需要设置 ASP.NET Core 的一些内置特殊配置时 环境变量和命令行这两个提供程序在早期是没有容器化的,当时一个操作系统会跑多个应用程序,应用程序注入配置的方式一般都是通过文件或者是命令行的方式来注入的,...
  • 08 | 配置框架:让服务无缝适应各种环境配置是应用程序发布到各种环境的必备能力,这一节开始详细讲解 ASP.NET Core 的配置框架配置框架的核心包有两个,一个抽象包,一个实现包M...
  • 29 | 定义仓储:使用EF Core实现仓储层首先定义仓储层的接口,以及仓储层实现的基类,抽象类仓储层的接口namespace GeekTime.In...
  • 35 | MediatR:让领域事件处理更加优雅核心对象IMediatorINotificationINotificationHandler这两个与之前的 Request 的行为是不一...
  • .NET Core 的依赖注入框架,它的核心扩展点是 IserviceProviderFactory 第三方的依赖注入容器都是用了这个类来作为扩展点,把自己注入到整个框架里来 也就是说在使用这些依赖注入框架的时候,不需要关注说谁家的特性...
  • 05 | 依赖注入:良好架构的起点为什么要使用依赖注入框架借助依赖注入框架,我们可以轻松管理类之间的依赖,帮助我们在构建应用时遵循设计原则,确保代码的可维护性和可扩展性ASP.NET C...
  • 05 | 依赖注入:良好架构的起点注册完毕之后,想替换某些组件的某些部分时,可以使用 Replace 和 RemoveAllservices.AddSingleton<IOrder...
  • 22 | 异常处理中间件:区分真异常与逻辑异常这一节我们来讲解一下错误处理的最佳实践系统里面异常处理,ASP.NET Core 提供了四种方式1、异常处...
  • 25 | 路由与终结点:如何规划好你的Web API路由系统在 ASP.NET MVC 框架里面就已经存在了,在 ASP.NET Core 框架里面进行...
  • 26 | 工程结构概览:定义应用分层及依赖关系从这一节开始进入微服务实战部分这一节主要讲解工程的结构和应用的分层在应用的分层这里定义了四个层次:1、领域...
  • 这个接口实际上是由中国的开源社区开发的一个框架,借助这个框架,我们可以轻松的实现消息的发布和订阅 那我们如何来订阅其他微服务发出的消息呢? namespace GeekTime.API.Application.IntegrationEvents { public ...
  • ASP.NET Core 实际上已经默认帮我们把框架引入进来了 命名空间是:Microsoft.Extensions.Options 我们需要修改一下服务的入参 public class OrderService : IOrderService { //OrderServiceOptions _options; ...
  • 《ASP.NET Core项目开发实战入门》从基础到实际项目开发部署带你走进ASP.NET Core开发。ASP.NET Core项目开发实战入门是基于ASP.NET Core 3.1 ...
  • 23 | 静态文件中间件:前后端分离开发合并部署骚操作我们先来看一下静态文件中间件有哪些能力1、支持指定相对路径2、支持目录的浏览3、支持设置默认文档4...
  • 23 | 静态文件中间件:前后端分离开发合并部署骚操作这里还有一个比较特殊的用法一般情况下,我们前后端分离的架构,前端会编译成一个 index.html...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,333
精华内容 4,133
关键字:

.netcore开发实战