首先解答一下為什么我寫的博客樣式這么丑。
- 首先博客園的這個富文本框是真的差,然后就是其實我可以自己寫樣式來修改,但是真的感覺是沒有必要花費大把的時間用在沒用的東西上,內容才是核心,哈哈哈!!!開始正文。
一、IOC的概念。
1. 之前我們寫程序的時候所有對象都是程序員手動new的,當項目大了之后這樣做的壞處各模塊之間耦合嚴重,想要更換為其他實現類的時候很麻煩
2. 有的程序員只關心“給我一個實現了**接口的類”,它不想關心這個類是怎么來的。因此就誕生了c( Inversion of Control,控制反轉)容器。使用OC容器后,不再是由程序員自己new對象,而是由框架幫你new對象。
3. 現在1OC有很多: Spring. Net、 Unity、 Castle、 AutoFac等。目前最火的就是 AutoFac.
4. 使用oc容器的時候,一般都是建議基於接口編程,也就是把方法定義到接口中,然后再編寫實現類。在使用的時候聲明接口類型的變量、屬性,由容器負責賦值。接口、實現類一般都是定義在單獨的項目中,這樣可以減少相互的耦合。
二、什么是Autofac?類似於的Autofac都有什么?
Autofac就是用來依賴注入的一個容器,用來解耦,並且由該容易來統一構建出對象。最開始我使用的容器時spring.net中的容器。
三、Autofac的實現於案例:
1. 新建一個接口類庫項目

1 namespace MyIBLL 2 { 3 public interface IUserBll 4 { 5 bool Check(string username, string pwd); 6 void AddNew(string username, string pwd); 7 } 8 }
2. 實現接口的類庫項目

1 namespace MyBllImpl 2 { 3 public class UserBll : IUserBll 4 { 5 public void AddNew(string username, string pwd) 6 { 7 Console.WriteLine("新增用戶,username="+ username); 8 } 9 10 public bool Check(string username, string pwd) 11 { 12 Console.WriteLine("檢查登錄,username=" + username); 13 return true; 14 } 15 } 16 }
3. 最差勁的實現的方式如下:
IUserBll bll = new UserBll() :這是最開始最low的實現方式,其實感覺還不如直接new一個對象更簡單。
4. 稍微進步一點的改善:該版本還是有點惡心的
1 //構建一個容器對象 2 ContainerBuilder builder = new ContainerBuilder(); 3 //把UserBll注冊為IUserBll實現類 4 builder.RegisterType<UserBll>().As<IUserBll>(); 5 IContainer container = builder.Build(); 6 IUserBll bll = container.Resolve<IUserBll>();//new UserBll 7 Console.WriteLine(bll.GetType());
5. 再次改善
//拿到實現類的程序集 Assembly asm = Assembly.Load("MyBllImpl"); //創建該程序集下所有實現類對應對應的接口都進行關聯。 builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces() .PropertiesAutowired().SingleInstance(); //創建一個容器 IContainer container = builder.Build(); //拿出一個對象 IUserBll bll = container.Resolve<IUserBll>();//new UserBll //使用 Console.WriteLine(bll.GetType());
7. 屬性注入:如果一個實現類中定義了其他類型的接口屬性,還可以在注冊的時候加上PropertiesAutowired,也就是 AslmplementedInterfaces().PropertiesAutowired(還會自動給屬性進行“注入”如果可能有多個實現類,還可以聲明 numerable< Iservice1>類型的屬性
case: 給對象添加一個屬性
1 public class School : ISchool 2 { 3 //屬性 4 public IDogBll DogBll { get; set; } 5 6 public void FangXue() 7 { 8 DogBll.Bark(); 9 Console.WriteLine("放學啦"); 10 } 11 }
在注冊時候同時添加屬性注入:builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().PropertiesAutowired(),最后的SingleInstance()表示時一個單例模式的注入。
//拿到實現類的程序集 Assembly asm = Assembly.Load("MyBllImpl"); //創建該程序集下所有實現類對應對應的接口都進行關聯。 builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces() .PropertiesAutowired().SingleInstance(); //創建一個容器 IContainer container = builder.Build(); //拿出一個對象 IUserBll bll = container.Resolve<IUserBll>();//new UserBll //使用 Console.WriteLine(bll.GetType());
8. AutoFac對象的生命周期
根據到底創建多少個對象, AutoFac有如下的生命周期,在 Register**后面以
nstance**()進行配置:
1) Per Dependency:每次請求 Resovle都返回一個新對象: Instance PerDependencyO
2) Single Instance:單例,每次都返回同一個對象: SinglelnstanceO
3) Per Lifetime Scope:每個生命周期一個對象;
4) InstancePerRequest: ASP. Net MVC專用,每個請求一個對象。 InstancePerRequest()
建議:最好配置成無狀態的(實現類中不要有成員變量),並且使用單例方式
謝謝學習!!!
創作不易:請標明作品出處:https://www.cnblogs.com/wangjinya/p/12797392.html