MVC中Autofac的使用
網上大佬的原地址:
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;View Codeusing 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; usingAutofac.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 } } }View Code
2.屬性註入
(1)自動註入。
a.與1.(1) 構造函數註入的自動註入 配置,大部分一致,
b.需要修改的地方。註入調用者時,需要在最後面加上.PropertiesAutowired();
引用的對象,將構造函數修改為屬性。
(2)手動註入
a.與2.(1) 同理,大部分一致
b.需要修改的地方。百度上說註入調用者時,需要在最後面加上.PropertiesAutowired();
但是在實際調用時,仍然調用失敗。未進行深入研究。
五、備註
為書寫和觀看方便,當前使用的是。自動註入+屬性註入。
MVC中Autofac的使用