网上大佬的原地址:
https://www.cnblogs.com/liupeng/p/4806184.html
https://blog.csdn.net/qq_37214567/article/details/78227628?locationnum=2&fps=1
一、需要引用的文件,使用Nuget安装
第一个为Autofac
第二个为Autofac的MVC扩展
二、项目结构
测试使用的表名称为SysSample,图中2-6为其BLL、DAL、IBLL、IDAL、Models 项目。
三、关系
四、使用
1、构造函数注入
(1)自动注入。BLL、Controller 均是由Autofac统一注入
a.创建一个 统一被继承的接口,IDependency
b.引用。BLL、IBLL、DAL、IDAL 四个项目均引用IDependency所在的Apps.AutofacBase项目。
c.继承.。ISysSampleBLL和ISysSampleRepository均继承此接口
d.构造函数。SysSampleBLL和SysSampleController构造函数修改。
e.Web项目的引用。Web需要添加对BLL、IBLL、DAL、IDAL四个项目的引用。否则自动注入时,缺少未引用项目的注入信息。
f.Application_Start()方法的修改
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Reflection;using System.Web;using System.Web.Mvc;using System.Web.Optimization;using System.Web.Routing;using Apps.AutofacBase;using Apps.BLL;using Apps.DAL;using Apps.IBLL;using Apps.IDAL;using Autofac;using Autofac.Integration.Mvc;namespace Apps.Web{ ???public class MvcApplication : System.Web.HttpApplication ???{ ???????protected void Application_Start() ???????{ ???????????AreaRegistration.RegisterAllAreas(); ???????????RouteConfig.RegisterRoutes(RouteTable.Routes); ???????????//启用jscss压缩 ???????????BundleTable.EnableOptimizations = true; ???????????BundleConfig.RegisterBundles(BundleTable.Bundles); ???????????#region 自动注入 ???????????//创建autofac管理注册类的容器实例 ???????????var builder = new ContainerBuilder(); ???????????Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray(); ???????????//注册所有实现了 IDependency 接口的类型 ???????????Type baseType = typeof(IDependency); ???????????builder.RegisterAssemblyTypes(assemblies) ??????????????????.Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract) ??????????????????.AsSelf().AsImplementedInterfaces() ??????????????????.PropertiesAutowired().InstancePerLifetimeScope(); ???????????//注册MVC类型 ???????????builder.RegisterControllers(assemblies).PropertiesAutowired(); ???????????builder.RegisterFilterProvider(); ???????????var container = builder.Build(); ???????????DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); ???????????#endregion ???????} ???}}
(2)手动注入
无需创建IDependency接口。
需要将所有需要注入的类、接口、调用者一一列出。
Application_Start()方法的修改
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Reflection;using System.Web;using System.Web.Mvc;using System.Web.Optimization;using System.Web.Routing;using Apps.AutofacBase;using Apps.BLL;using Apps.DAL;using Apps.IBLL;using Apps.IDAL;using Apps.Web.Controllers;using Autofac;using Autofac.Integration.Mvc;namespace Apps.Web{ ???public class MvcApplication : System.Web.HttpApplication ???{ ???????protected void Application_Start() ???????{ ???????????AreaRegistration.RegisterAllAreas(); ???????????RouteConfig.RegisterRoutes(RouteTable.Routes); ???????????//启用jscss压缩 ???????????BundleTable.EnableOptimizations = true; ???????????BundleConfig.RegisterBundles(BundleTable.Bundles); ???????????#region 手动注入 ???????????//创建autofac管理注册类的容器实例 ???????????var builder = new ContainerBuilder(); ???????????????????????/*需要进行依赖注入的IBLL*/ ???????????//类和接口的关系 ???????????builder.RegisterType<SysSampleRepository>().As<ISysSampleRepository>(); ??????????????????builder.RegisterType<SysSampleBLL>().As<ISysSampleBLL>(); ???????????//调用者的注入。 ???????????builder.RegisterType<SysSampleBLL>().InstancePerDependency();//SysSampleBLL中调用了DAL层 ???????????//(不推荐)单个Controller控制器注册 ???????????builder.RegisterType<SysSampleController>().InstancePerDependency();//SysSampleController调用的BLL层 ???????????//(推荐写法)使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller一次性的完成注册 ???????????????????????????????????//builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired(); ???????????//生成具体的实例 ???????????var container = builder.Build(); ???????????//下面就是使用MVC的扩展 更改了MVC中的注入方式. ???????????DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); ???????????#endregion ???????} ???}}
2.属性注入
(1)自动注入。
a.与1.(1) 构造函数注入的自动注入 配置,大部分一致,
b.需要修改的地方。注入调用者时,需要在最后面加上.PropertiesAutowired();
引用的对象,将构造函数修改为属性。
(2)手动注入
a.与2.(1) 同理,大部分一致
b.需要修改的地方。百度上说注入调用者时,需要在最后面加上.PropertiesAutowired();
但是在实际调用时,仍然调用失败。未进行深入研究。
五、备注
为书写和观看方便,当前使用的是。自动注入+属性注入。
MVC中Autofac的使用
原文地址:https://www.cnblogs.com/masonblog/p/9537326.html