在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、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; } } 遵循选项模式允许将设置和配置彼此分离,并且确保控制器遵循关注点分离,因为不需要知道如何在哪里找到设置信息。由于控制器类中没有静态附着或者直接实例化设置类,因此使得控制器更容易使用单元测试。 到此这篇关于 |
请发表评论