Dependency Injection in ASP.NET Core MVC

在ASP.NET Core中,依赖注入(DI)是一种将组件间的依赖关系传递给组件本身的方法,而不是让组件自行创建或查找其依赖关系。这种模式有助于降低组件间的耦合度,提高代码的可测试性和可维护性。在ASP.NET Core MVC中,依赖注入不仅适用于中间件、控制器和模型,还可以在视图中使用。

向视图提供数据和行为有几种选择,例如使用ViewDataViewBag、自定义类型(视图模型)和通过依赖注入提供的自定义服务。最佳实践是使用专门的视图模型来提供数据,这除了其他好处外,还提供了在视图中对数据的强类型访问。

在视图中注入服务非常有用,特别是当想要在多个视图之间重用行为时。例如,为视图中的下拉列表或列表提供查找数据。

使用@inject指令可以将服务注入到视图中。其语法如下:

@inject service-type variable-name

请注意,变量名将在Razor中使用@符号,例如@Lookup,其中Lookup是变量名。

如何配置服务和中间件

在ASP.NET Core MVC中,可以通过以下方式为MVC添加服务和中间件:

public void ConfigureServices(IServiceCollection services) { services.AddScoped(); services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }

在上面的代码中,定义了一个名为LookupService的服务,并将其注册到服务容器中。然后,配置了MVC中间件,并通过MapRoute方法定义了默认路由。

添加服务

接下来,定义了一个名为ILookupService的接口,以及一个实现该接口的LookupService类:

public interface ILookupService { List<SelectListItem> Genres { get; } } public class LookupService : ILookupService { public List<SelectListItem> Genres { get { return new List<SelectListItem> { new SelectListItem { Value = "0", Text = "Thriller" }, new SelectListItem { Value = "1", Text = "Comedy" }, new SelectListItem { Value = "2", Text = "Drama" }, new SelectListItem { Value = "3", Text = "Romance" }, }; } } }

在这个例子中,创建了一个名为Genres的属性,该属性返回一个包含几个SelectListItem对象的列表。这些对象代表下拉列表中的选项。

添加控制器并返回视图结果

现在,添加一个控制器,该控制器返回一个视图结果:

public class HomeController : Controller { public IActionResult Index() { return View(); } }

在这个控制器中,定义了一个名为Index的操作方法,它返回一个视图结果。

最后,添加一个视图,该视图注入并使用之前定义的服务:

@using Fiver.Mvc.DependencyInjection.Models.Home @inject ILookupService Lookup <select name="genres"> <option value="-1">--Select Genre--</option> @foreach (var item in Lookup.Genres) { <option value="@item.Value">@item.Text</option> } </select>
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485