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);
}
}