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

发布于:2024-10-10 ⋅ 阅读:(13) ⋅ 点赞:(0)

习惯了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);
    }
}