当前位置: 首页 > article >正文

ASP.NET MVC5使用依赖注入实现DI asp.net mvc5使用依赖注入

ASP.NET MVC5使用依赖注入实现DI asp.net mvc5使用依赖注入

  • 1、 使用Ninject实现
    • 1.1、 安装Ninject NuGet包
    • 1.2、 创建Ninject依赖注入配置文件
    • 1.3、 配置Ninject
    • 1.4、 使用依赖注入
      • 1.4.1、 构造函数方式注入
      • 1.4.2、 注解方式注入
  • 2、 使用Autofac实现
    • 2.1、 安装Autofac NuGet包
    • 2.2、配置 Autofac
    • 2.3、 使用依赖注入
      • 2.3.1、 构造函数方式注入

习惯了Spring的IOC依赖注入开发,现在切换了asp.net开发,也想使用依赖注入,看官方文档 .net也有依赖注入(DI),在 asp.net mvc5中可以使用 Ninject、Autofac等其他第三方组件实现

1、 使用Ninject实现

1.1、 安装Ninject NuGet包

在 NuGet控制台中输入安装命令, 需要安装 Ninject 以及 Ninject.MVC5

Install-Package Ninject  
Install-Package Ninject.MVC5

1.2、 创建Ninject依赖注入配置文件

创建一个类来配置Ninject
类名: NinjectDependencyResolver.cs

using Ninject;
using Ninject.Web.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace AspNetBlog.App_Start {
    /**
     * 依赖注入插件
     * 需要使用NuGet安装 DI组件:Ninject 与 Ninject MVC
     * 
     */
    public class NinjectDependencyResolver : IDependencyResolver {

        private IKernel kernel;

        public NinjectDependencyResolver() {
            kernel = new StandardKernel();
            AddBindings();
        }

        public object GetService(Type serviceType) {
            return kernel.TryGet(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType) {
            return kernel.GetAll(serviceType);
        }

        /// <summary>
        /// 添加依赖绑定
        /// </summary>
        private void AddBindings() {
            //添加方式如下:左边括号里的是接口,后边括号里的实现接口的类
            //kernel.Bind<IAdminService>().To<AdminService>();
			// 注册 AdminService 服务, 我并没有使用服务实现模式,直接使用服务类,作用域为 每个请求 单例模式存在
			// InRequestScope 是单例模式,为每个请求创建一个独立的实例
            kernel.Bind<AdminService>().ToSelf().InRequestScope();
        }

        /// <summary>
        /// 注册其他依赖服务
        /// </summary>
        private void RegisterServices() {
            // 注册 DbContext,作用域为 每个请求 单例模式存在
            kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope();
        }
    }
}

1.3、 配置Ninject

将刚才创建的Ninject配置文件类 NinjectDependencyResolver.cs 注册到系统当中

Global.asax文件中 配置 Ninject

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Diagnostics;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace AspNetBlog {
    public class MvcApplication : System.Web.HttpApplication {
        protected void Application_Start() {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            
            // 配置 DbContext上下文
            Database.SetInitializer<ApplicationDbContext>(null);

            //注册Ninject容器
            DependencyResolver.SetResolver(new NinjectDependencyResolver());
        }
    }
}

1.4、 使用依赖注入

1.4.1、 构造函数方式注入

public class AdminController : BaseController {

    private readonly AdminService _adminService;
    
    // 构造函数注入
    public AdminController(AdminService adminService) {
        _adminService = adminService;
    }

    [HttpPost]
    public async Task<string> Save(Admin admin) {
        return await _adminService.Save(admin);
    }
}

1.4.2、 注解方式注入

public class AdminController : BaseController {

	// 注解方式注入
	[Ninject.Inject]
    private AdminService _adminService {get; set;}

    [HttpPost]
    public async Task<string> Save(Admin admin) {
        return await _adminService.Save(admin);
    }
}

2、 使用Autofac实现

2.1、 安装Autofac NuGet包

在 NuGet控制台中输入安装命令, 需要安装 Ninject 以及 Ninject.MVC5

Install-Package Autofac
Install-Package Autofac.Integration.Web

2.2、配置 Autofac

Global.asax文件中 配置 Autofac

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Diagnostics;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace AspNetBlog {
    public class MvcApplication : System.Web.HttpApplication {
        protected void Application_Start() {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            
            // 配置 DbContext上下文
            Database.SetInitializer<ApplicationDbContext>(null);

        	// 初始化 Autofac 容器
        	var builder = new ContainerBuilder();
        	builder.RegisterApiControllers(GlobalConfiguration.Configuration);

       		 // 注册 DbContext 依赖服务,作用域为单例模式
        	builder.RegisterType<ApplicationDbContext>().InstancePerRequest();
        	
			// 注册 业务依赖服务
			builder.RegisterType<AdminService>().InstancePerRequest();

        	// 构建容器
        	var container = builder.Build();

        	// 将容器设置为全局容器
        	GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

        	GlobalConfiguration.Configure(WebApiConfig.Register);
        }
    }
}

2.3、 使用依赖注入

2.3.1、 构造函数方式注入

public class AdminController : BaseController {

    private readonly AdminService _adminService;
    
    // 构造函数注入
    public AdminController(AdminService adminService) {
        _adminService = adminService;
    }

    [HttpPost]
    public async Task<string> Save(Admin admin) {
        return await _adminService.Save(admin);
    }
}

http://www.kler.cn/news/330748.html

相关文章:

  • sql-labs:17~41(sql时间盲注和布尔盲注、sql注入爆数据思路、简单的sql注入绕过)
  • 探索高效免费的PDF转Word工具,开启便捷办公之旅
  • 小程序用户截屏事件
  • nodejs:实现大文件的分段上传
  • java落地AI模型案例分享:xgboost模型java落地
  • linux自用小手册
  • ZYNQ: GPIO 之 EMIO 按键控制 LED 实验
  • Elasticsearch使用Easy-Es + RestHighLevelClient实现深度分页跳页
  • 【热门主题】000002 案例 JavaScript网页设计案例
  • 如何在 Kubernetes 上部署和配置开源数据集成平台 Airbyte?
  • LampSecurityCTF7 靶机渗透 (sql 注入, 文件上传, 密码喷射)
  • vue单点登录异步执行请求https://xxx.com获取并处理数据
  • 博文汇总目录
  • C语言自定义类型结构体
  • 茴香豆 + Qwen-7B-Chat-Int8
  • 高级架构师面试题
  • 第24天sql注入(小迪安全学习)
  • GPT与大模型行业落地实践探索
  • OpenCV视频I/O(13)视频采集类VideoCapture之等待多个视频流中的任意一个变为可用状态函数waitAny()的使用
  • HKMG工艺为什么要用金属栅极?