在ASP.NET Core中,依赖注入(DI)是一种将组件间的依赖关系传递给组件本身的方法,而不是让组件自行创建或查找其依赖关系。这种模式有助于降低组件间的耦合度,提高代码的可测试性和可维护性。在ASP.NET Core MVC中,依赖注入不仅适用于中间件、控制器和模型,还可以在视图中使用。
向视图提供数据和行为有几种选择,例如使用ViewData
、ViewBag
、自定义类型(视图模型)和通过依赖注入提供的自定义服务。最佳实践是使用专门的视图模型来提供数据,这除了其他好处外,还提供了在视图中对数据的强类型访问。
在视图中注入服务非常有用,特别是当想要在多个视图之间重用行为时。例如,为视图中的下拉列表或列表提供查找数据。
使用@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>