在你閱讀時,默認已經了解IOC,依賴注入和基本用法,如果還有不懂的小伙伴你們可以去這個地址看看,https://www.bilibili.com/video/av7606481/?p=30,對於依賴注入講解的很清楚!
我在最近的我的項目中運用了IOC autofac 實現了依賴注入,由於我的項目是asp.net MVC 5 ,所以我目前向大家展示MVC中如何使用autofac
首先在app_start中新建一個類包含以下方法:類名最好取名:AutofacConfig
using System.Reflection; using Autofac; using Autofac.Integration.Mvc; using System.Web.Mvc; using Microsoft.Extensions.Configuration; using Autofac.Configuration; using Microsoft.Extensions.Configuration.Json;//有的小伙伴可能無法安裝,因為他是僅支持.net framwork 4.6以上的版本,如果你使用4.6以下的版本,記得修改你的版本號,可以點擊你的UI程序項目點擊屬性修改成4.6.1之后進行安裝,安裝完成后可以改回來哦! namespace SingleBlog.UI.App_Start { public class AutofacConfig { public static void Register()//最好使用靜態方法 { //創建容器 var builder = new ContainerBuilder(); IConfigurationBuilder config = new ConfigurationBuilder(); //使用json注冊文件 IConfigurationSource autofacJsonConfigSource = new JsonConfigurationSource() { Path = "Autofac.json", Optional = false,//boolean,默認就是false,可不寫 ReloadOnChange = false, }; //配置添加到autofac的configuration內中 config.Add(autofacJsonConfigSource); //將json的文件配置注冊到autofac的容器內 var module = new ConfigurationModule(config.Build()); builder.RegisterModule(module); //使用Autofac提供的RegisterControllers擴展方法來對程序集中所有的Controller注冊 builder.RegisterControllers(Assembly.GetExecutingAssembly()); //創建一個Autofac的容器 var container = builder.Build(); //下面就是使用MVC的擴展 更改了MVC中的注入方式. DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); } } }
這段代碼的意思,就是從json文件中讀取相應的注入內容!
但是注意!程序集中該引用的必須要引用,我貼出了引用代碼為了方便大家去尋找
同時,創建一個根據autofac官網提示IOC的一個json文件,起名為Autofac.json,為了方便我直接放在了UI程序項目的根目錄
內容如下
{
//在Autofac的文檔中可以設置默認程序集,此處就不設置了
"components": [
{
"type": "程序集.實現邏輯的類,你的實現類的程序集",
"services": [{"type": "接口所在的程序集.接口,接口所在程序集"}],
"autoActivate": true,//是否是自動注入
"injectProperties": true//是否使用屬性注入
}
后面可以接着寫你的注入內容,注意每個實現的類和接口只能有一個對應的compoents!
},.......后面可以復制粘貼了
因為我是拿我的項目來介紹,這是根據DAL與IDAL的依賴注入,同理BLL和IBLL都可以,你可以接着寫。
這兩個文件都是在MVC框架中即UI中,與IBLL和IDAL分離為了方便我放出我的項目圖
請注意!使用JSON注入需要你在UI項目下引用所有的DLL包括實現類的DLL!
寫好了之后,就是如何使用了
但是在使用之前還必須得在你的項目啟動類Global.asax中引用autofacconfig類,比如我的引用
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); AutofacConfig.Register();//直接調用靜態方法 }
之后在項目的控制器中即可以使用BLL和DAL的方法,做到了依賴抽象而不用依賴細節
private IArticleService _articleService; private IQQUserInfoService _qQUserInfoService; public IndexController(IArticleService ArticleService,IQQUserInfoService QQUserInfoService)//通過構造函數進行注入 { this._articleService = ArticleService; this._qQUserInfoService = QQUserInfoService; }
這是一個Index控制器,我申明私有的IBLL邏輯,在構造函數中注入進去后使用,即可以訪問到BLL的實現邏輯
但是注意在BLL如果要這樣做的話,必須申明public類型的屬性哦,不然不能使用哦!哦對了,前提你還得在JSON文件中表明你的類和你的接口是允許使用屬性注入!
使用這方法可以簡單高效的進行IOC的依賴注入,使得你的項目更加的松耦合!
對於泛型注入,官網的實例也有,但是不推薦進行JSON的泛型注入,應該在接口中定義泛型,然后在實現類繼承的接口中直接指定類型去調用!
autofac的使用介紹就到這里,如果還有不明白的,請探尋官網的原理和閱讀該地址
https://www.cnblogs.com/wolegequ/archive/2012/06/09/2543452.html
該地址詳細介紹了關於autofac的生命周期和特點
本次實例很簡單,希望某些大神可以給點關注,給點評價,菜鳥一枚,還望各位海涵,如有代碼錯誤或者其他漏點,請與我聯系,我將會及時改正,希望與博客園的各位大佬共同進步!每天學習一點點小知識!