Visual

MVC 07 - 配置 和 ViewComponent.mp4 (94.98MB)

配置

  • Key-Value 键值对
  • 内存,JSON,XML,INI,环境变量,启动参数
  • 从配置系统解耦
  • 为依赖注入优化

查看 Program 类 CreateDefaultBuilder 的源码:
image.png

  1. AddJsonFile 依次加载了默认的配置文件和基于环境变量名的配置文件
    1. 如果两个配置文件中有重复的键值对,取下面一个的为准
  2. AddEnvironmentVaiables 从环境变量加载配置

IConfiguration

通过在 Startup 里面依赖注入 IConfiguration,可以将 json 配置文件的属性和实体类的属性相绑定。

JSON:

  1. "ConnectionStrings": {
  2. "DefaultConnection": "Database=InMemory;"
  3. }

class:

  1. namespace CoreDemo.Settings
  2. {
  3. public class ConnectionOptions
  4. {
  5. public string DefaultConnection { get; set; }
  6. }
  7. }

Startup:

  1. public class Startup
  2. {
  3. private readonly IConfiguration _configuration;
  4. public Startup(IConfiguration configuration)
  5. {
  6. _configuration = configuration;
  7. }
  8. public void ConfigureServices(IServiceCollection services)
  9. {
  10. services.AddMvc();
  11. ...
  12. // 和实体类的属性相绑定
  13. services.Configure<ConnectionOptions>(_configuration.GetSection("ConnectionStrings"));
  14. }
  15. ...
  16. }

具体使用

注入到 Controller 中使用:

  1. public class HomeController : Controller
  2. {
  3. private readonly ICinemaService _cinemaService;
  4. private readonly IOptions<ConnectionOptions> _options;
  5. public HomeController(ICinemaService cinemaService,IOptions<ConnectionOptions> options)
  6. {
  7. _cinemaService = cinemaService;
  8. _options = options;
  9. }
  10. ...
  11. }

在视图中注入使用:

  1. @inject IOptions<ConnectionOptions> options
  2. <span>@options.Value.DefaultConnection</span>

自定义配置

image.png

View Component

以前有 Partial View,但是无法包含业务逻辑,Controller 里的逻辑也无法复用。

View Component 的优势:

  • 相当于带着小型 Controller 的 Partial View
  • 适用于较复杂业务
  • 可使用 Razor 语法

定义

推荐的做法是:

  1. 前端项目中创建 ViewComponents 文件夹
  2. 创建以 ViewComponent 结尾的类
  3. 在 Views\Shared\Components\MovieCount 下创建默认视图文件 Default.cshtml

MovieCountViewComponent:

  1. using System.Linq;
  2. using System.Threading.Tasks;
  3. using CoreDemo.Services;
  4. using Microsoft.AspNetCore.Mvc;
  5. namespace CoreDemo.ViewComponents
  6. {
  7. public class MovieCountViewComponent : ViewComponent
  8. {
  9. private readonly IMovieService _movieService;
  10. public MovieCountViewComponent(IMovieService movieService)
  11. {
  12. _movieService = movieService;
  13. }
  14. // IViewComponentResult 类似于 Controller 里面的 IActionResult
  15. public async Task<IViewComponentResult> InvokeAsync(int cinemaId)
  16. {
  17. var movies = await _movieService.GetByCinemaAsync(cinemaId);
  18. var count = movies.Count();
  19. return View(count);
  20. }
  21. }
  22. }

Default.cshtml:

  1. @model int
  2. <h2>Movie Count:</h2>
  3. <h2>@Model</h2>

使用

通过 :

  1. @await Component.InvokeAsync("MovieCount", new { cinemaId = ViewBag.CinemaId })

类似于 HTML 标签的用法:

  1. <vc:movie-count cinema-id="@ViewBag.CinemaId"></vc:movie-count>

注:第二种用法需先在 _ViewImports 里面引入当前项目:

  1. @addTagHelper "*, CoreDemo"

源码

CoreDemo.zip