依赖注入

38-依赖注入inject

ASP.NET Core 支持在视图中使用依赖注入。使用 @inject 把服务注入到视图中:@inject 类型 名称,如 @inject。

定义一个被调用的类:

public class PhoneHelper
{
    public string ExecuteMethod()
    {
        return "FoxDevelop.com";
    }
}Code language: PHP (php)

以前使用它需要 new:

var phone = new PhoneHelper();Code language: JavaScript (javascript)

在 Startup 中添加注入项,把 PhoneHelper 加入到依赖注入容器里面:

public void ConfigureServices(IServiceCollection services)
{
    //services.AddMvc();
    services.AddMvc(options => {
        options.Filters.Add(new MyActionFilter());
    }); //在service服务里面 注入我们的过滤器

    //添加依赖注入项
    services.AddTransient<PhoneHelper>();
}Code language: JavaScript (javascript)

视图中可以直接使用:

@inject PhoneHelper phoneHelperCode language: CSS (css)

然后就可以调用:

@phoneHelper.ExecuteMethod()Code language: CSS (css)

39-Controller中使用依赖注入

控制器应通过它们的构造器明确地请求它们的依赖关系(构造函数注入)。

比如现在创建一个接口类:

public interface IDateTime
{
    DateTime Now { get; }
}Code language: PHP (php)

创建一个实现了这个接口的类:

public class ChinaDateTime : IDateTime
{
    public DateTime Now
    {
        get { return DateTime.Now; }
    }
}

假设我们在控制器里面需要使用 ChinaDateTime(其实一般我们的控制器需要用到的是数据库上下文、帮助类、缓存等等,比如 Memcache)。

在控制器的构造函数里面:

private IDateTime dateTime;

public HomeController(IDateTime dateTime)
{
    this.dateTime = dateTime;
}Code language: PHP (php)

谁调用控制器的构造函数?谁给我传呢?—— MVC 底层。

注入依赖关系:

public void ConfigureServices(IServiceCollection services)
{
    //services.AddMvc();
    services.AddMvc(options => {
        options.Filters.Add(new MyActionFilter());
    }); //在service服务里面 注入我们的过滤器

    //添加依赖注入项
    services.AddTransient<PhoneHelper>();
    services.AddTransient<IDateTime, ChinaDateTime>();
}Code language: JavaScript (javascript)

使用 DateTime 对象:

ViewBag.Title = "首页" + dateTime.Now.ToString();Code language: JavaScript (javascript)

40-区域

区域是在一个 MVC 项目中有一个相对独立的子 MVC 模块,拥有独立命名空间、独立的文件夹结构,也有一套 Model、View、Controller,还需要路由规则。这样我们可以把一些多业务的系统分离出来,比如把搜索功能、用户管理、后台管理等独立出来作为一个区域。

右击项目,添加一个区域,名称 Search,然后添加控制器和视图。

需要在 Startup 里面注册:

app.UseMvc(routes =>
{
    routes.MapAreaRoute("search", "Search", "search/{controller=Default}/{action=Index}/{id?}");
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});Code language: JavaScript (javascript)

访问地址:http://localhost:5630/search/default/index

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注