ico是和autofac这些是什么我都不用多解释了。
最近一直在autofac官网看他们的文档,本人英语水平不太好。全靠翻译软件进行学习。今天对autofac和mvc的结合的学习进行一个总结。废话不多说,现在开始!
首先创建好一个mvc的项目,创建好相对应的接口和实现类,然后创建好控制器和视图以便于测试,我的开发工具是vs2017。
1. 安装 mvc 的 autofac 插件: 在Guget直接搜索 “autofac” 和 “autofac.mvc5” 进行安装,下面的图片是我做好的测试类。类里面实现了很简答的几个方法。
2. 在Global文件中进行编写
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; using Autofac.Integration.Mvc; using Autofac; using System.Reflection; namespace MVC_autofac { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); var builder = new ContainerBuilder(); builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired(); //把当前程序集中的controller都进行注册
Assembly[] assemblies =new Assembly[] { Assembly.Load("Test") }; //生命一个可变数组,可以加载多个类库
builder.RegisterAssemblyTypes(assemblies).Where(t=>!t.IsAbstract).AsImplementedInterfaces().PropertiesAutowired(); // 获取所有相关类库的程序集
var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); } } }
3. 控制器代码如下
using ITest; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVC_autofac.Controllers { public class UserInfoController : Controller { public IUserInfo UserInfo { get; set; } // GET: Default public ActionResult Index() { bool b = UserInfo.CheckLogin("aaa", "123"); return Content(b.ToString()); } } }
4. 但是在有的时候会出现没有注入到的地方(比如 Helper中),如果想获取对象,就要使用以下代码。首先我在mvc项目里创建了一个 TestHelper 类,代码如下
using ITest; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVC_autofac { public class TestHelper { public static void Test() { IUserInfo userInfo = DependencyResolver.Current.GetService<IUserInfo>();//使用这个方式来对未注册类的实例化 userInfo.CheckLogin("aaa", "123"); } } }
5. 如果在 Quart 等单独线程中,是无法通过 DependencyResolver.Current.GetService<接口名>() 直接获取的 就要使用下面的方式
定义一个实现 IJob 借口的类
using ITest; using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Autofac; using Autofac.Integration.Mvc; namespace MVC_autofac { public class TestJob : IJob { public void Execute(IJobExecutionContext context) { try { // IUserInfo userInfo = DependencyResolver.Current.GetService<IUserInfo>(); IUserInfo userInfo; var container = AutofacDependencyResolver.Current.ApplicationContainer; using (container.BeginLifetimeScope()) { userInfo = container.Resolve<IUserInfo>(); } userInfo.CheckLogin("aaa", "123"); } catch (Exception ex) { } } } }
6. 源码下载地址
链接:https://pan.baidu.com/s/1Ac0N4VzjuviIKnSzvExdDw 密码:ilg5