ASP.NET Core MVC 依赖注入View与Controller |
一、ASP.NET Core MVC 之依赖注入 View 使用 例如:
@model MVCTest.Models.Operation
@using MVCTest.Services
@inject BaseInfoServices BaseInfoServices
@{
ViewData["Title"] = "Create";
}
<ul>
@foreach (var city in BaseInfoServices.GetCities())
{
<li>@city</li>
}
</ul>
public class BaseInfoServices
{
public List<string> GetCities()
{
return new List<string>();
}
}
需要提前在 1.填充查找数据 视图注入有助于填充 UI 元素,例如下拉框列表 。比如一个包括性别,州以及其他用户资料的表单 。如果通过标准的 MVC 方式渲染这个表单,则需要控制器为每一组选项都请求数据访问服务,然后将每一组绑定的选项填充到模型或 另一种则是直接将服务注入到视图中以获取这些选项数据 。这种方法将控制器代码量减少到最少,把构造视图元素的逻辑移到视图本身去 。控制器 2.重写服务 除了注入服务外,此技术还可用于重写页面上先前注入的服务 。例如,替换默认的 @model MVCTest.Models.Operation @using MVCTest.Services @inject BaseInfoServices BaseInfoServices @inject MyHtmlHelper Html 在视图中使用 如果想要扩展现有服务而不是替换,则只需在使用此技术的同时,让服务继承或者封装已有实现即可 。 二、 ASP.NET Core MVC 之依赖注入 Controller
依赖注入是一种如 1.构造函数注入 定义接口和实现:
namespace MVCTest.Services
{
public interface IDateTime
{
DateTime Now { get; }
}
public class SystemDateTime: IDateTime
{
public DateTime Now
{
get { return DateTime.Now; }
}
}
}
在 services.AddTransient<IDateTime, SystemDateTime>(); 在控制其中使用:
public class DateTimeController : Controller
{
private IDateTime _dateTime;
public DateTimeController(IDateTime dateTime)
{
_dateTime = dateTime;
}
// GET: DateTime
public ActionResult Index()
{
var serverTime = _dateTime.Now;
if (serverTime.Hour < 12)
{
ViewData["Message"] = "Good Morning";
}
return View();
}
}
2.使用 FromServices 操作注入 有时,不需要在控制器为多个操作提供服务 。在这种情况下,将服务注入到操作方法的参数是有意义的 。通过
public ActionResult Index([FromServices] IDateTime _dateTime)
{
var serverTime = _dateTime.Now;
if (serverTime.Hour < 12)
{
ViewData["Message"] = "Good Morning";
}
return View();
}
3.在控制器中访问设置 在控制器中访问应用程序设置或者配置设置时常见的模式 。此访问应当使用在 创建选项类:
public class AppSettingOptions
{
public DefaultConnec ConnectionStrings { get; set; }
public string AllowedHosts { get; set; }
}
public class DefaultConnec
{
public string DefaultConnection { get; set; }
}
appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=.;Initial Catalog=Test;Integrated Security=True"
},
"Logging": {
"LogLevel": {
"Default": "Information"
}
},
"AllowedHosts": "*"
}
配置应用程序使用选项模型,在
public Startup(IConfiguration configuration,IHostingEnvironment env)
{
//Configuration = configuration;
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json",optional:true,reloadOnChange:true)
//.AddJsonFile($"appsettings.{env.EnvironmentName}.json",optional:true)
;
//配置环境变量
//builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
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)
{
services.AddOptions();
services.Configure<AppSettingOptions>(Configuration);
//通过代码编写
services.Configure<AppSettingOptions>(options=>
{
options.AllowedHosts = "test";
});
}
示例是从 一旦指定了请类型的配置对象
public class HomeController : Controller
{
private readonly IOptions<AppSettingOptions> _options;
public HomeController(IOptions<AppSettingOptions> options)
{
_options = options;
}
}
遵循选项模式允许将设置和配置彼此分离,并且确保控制器遵循关注点分离,因为不需要知道如何在哪里找到设置信息 。由于控制器类中没有静态附着或者直接实例化设置类,因此使得控制器更容易使用单元测试 。 到此这篇关于 |