1. 程式人生 > >MVC中Autofac的使用

MVC中Autofac的使用

app dom ras sse ren route depend autofac posit

網上大佬的原地址:

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 } } }
View Code

(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的使用