Autofac介紹和使用


首先解答一下為什么我寫的博客樣式這么丑。

  •   首先博客園的這個富文本框是真的差,然后就是其實我可以自己寫樣式來修改,但是真的感覺是沒有必要花費大把的時間用在沒用的東西上,內容才是核心,哈哈哈!!!開始正文。

一、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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM