日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
通過(guò)ASP.NET實(shí)現(xiàn)依賴注入

ASP.NET 是一個(gè)使用 HTML、CSS、JavaScript 和服務(wù)器腳本創(chuàng)建網(wǎng)頁(yè)和網(wǎng)站的開(kāi)發(fā)框架。ASP.NET 支持三種不同的開(kāi)發(fā)模式: Web Pages(Web 頁(yè)面)、MVC(Model View Controller 模型-視圖-控制器)、Web Forms(Web 窗體)。

義縣網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)成立與2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)

前言

在java的spring中有自動(dòng)注入功能,使得代碼變得更加簡(jiǎn)潔靈活,所以想把這個(gè)功能移植到c#中,接下來(lái)逐步分析實(shí)現(xiàn)過(guò)程

1.使用自動(dòng)注入場(chǎng)景分析

在asp.net mvc中,無(wú)論是什么代碼邏輯分層,最終的表現(xiàn)層為Controller層,所以我們注入點(diǎn)就是在Controller中,這里我們需要替換默認(rèn)的ControllerFactory,掃描代碼中標(biāo)記需要注入的對(duì)象,進(jìn)行實(shí)例化注入

public class FastControllerFactory : DefaultControllerFactory
 {
   public override IController CreateController(RequestContext requestContext, string controllerName)
   {
     Type type = this.GetControllerType(requestContext, controllerName);
     Object obj = GetControllerInstance(requestContext, type);

     //Controller中標(biāo)記AutoWired屬性的自動(dòng)注入
     List AutoWiredFieldList = type.GetRuntimeFields().Where(f => f.GetCustomAttribute(typeof(AutoWired)) != null).ToList();
     foreach (FieldInfo field in AutoWiredFieldList)
     {
       field.SetValue(obj, InjectUtil.Container.Resolve(field.FieldType));
     }
     return obj as IController;
   }
 }

FastControllerFactory就是我們自定義的一個(gè)Controller工廠,重寫CreateController方法,對(duì)標(biāo)記了AutoWired這個(gè)自定義注解的變量,從Bean容器中取出實(shí)例進(jìn)行賦值,同時(shí)我們還需要在Global文件中的Start方法中,進(jìn)行默認(rèn)工廠進(jìn)行替換

ControllerBuilder.Current.SetControllerFactory(new FastControllerFactory());

2.IOC容器的實(shí)現(xiàn)

c#中的自定義容器有很多開(kāi)源成熟的框架,例如AutoFac等,這里我們是自己實(shí)現(xiàn)一個(gè)輕量級(jí)的版本

源碼地址:https://gitee.com/grassprogramming/FastIOC

這里就重點(diǎn)說(shuō)一下如何在asp.net mvc中的使用,首先我們需要對(duì)需要注入的Bean對(duì)象進(jìn)行標(biāo)記,這個(gè)標(biāo)記就叫做Component,

在asp.net mvc Global文件中的Start方法中,我們需要將整個(gè)項(xiàng)目中需要自動(dòng)注入的Bean加入到容器中

public class InjectUtil
 {
   public static ContainerBuilder Container;
   public static void Init()
   {
     Container = new ContainerBuilder();
      //獲取所有程序集
     var assemblies = System.Web.Compilation.BuildManager.GetReferencedAssemblies().Cast().ToArray();
     //注入所有Component組件
     Container.RegisterAssemblyTypes(assemblies, typeof(Component),true);
     Container.Build();
   }
 }

到這里Controller層面的事項(xiàng)就已經(jīng)完成了,接下來(lái)就需要在IOC容器中初始化Bean實(shí)例方法中進(jìn)一步處理

private Object GetInstance(RegisterEntity Entity)
   {
     Object obj = null;
     if (Entity.IsEnableIntercept)
     {
       bool IsExtend = Entity.RealType == Entity.RegistType;
       obj = DynamictProxy.CreateProxyObject(Entity.RealType, Entity.RegistType, Entity.InterceptType, IsExtend, Entity.IsInterceptAllMethod);


     }
     else
     {
       var constructors = Entity.RegistType.GetConstructors();
       obj = constructors[0].Invoke(new Object[] { });
     }
     //這里使用單例模式將實(shí)例化Instance存儲(chǔ),提前暴露未進(jìn)行后續(xù)設(shè)置的對(duì)象實(shí)例
     if (!SingleInstanceDic.ContainsKey(Entity.RealType))
     {
       SingleInstanceDic.Add(Entity.RealType, obj);
     }
   
     //如果這個(gè)class標(biāo)記了Component,且有標(biāo)記了AutoWired的Field,進(jìn)行自動(dòng)注入
     if (Entity.RealType.GetCustomAttribute(typeof(Component), true) != null)
     {
       //這里要使用GetRuntimeFields,此方法返回在指定類型上定義的所有字段,包括繼承,非公共,實(shí)例和靜態(tài)字段。
       foreach (FieldInfo Field in Entity.RealType.GetRuntimeFields())
       {
         if (Field.GetCustomAttribute(typeof(AutoWired), true) != null)
         {
           Type FieldType = Field.FieldType;
           if (Contains(FieldType))
           {
             //判斷單例存儲(chǔ)中是否包含,如果有,取出賦值,這里可以防止循環(huán)依賴導(dǎo)致的死循環(huán)
             if (SingleInstanceDic.ContainsKey(FieldType))
             {
               Field.SetValue(obj, SingleInstanceDic[FieldType]);
             }
             else
             {
               Field.SetValue(obj, Resolve(FieldType));
             }
             
           }
         }
       }
     }
     return obj;

   }

GetInstance方法就是實(shí)例化Bean對(duì)象的核心方法,其實(shí)很簡(jiǎn)單,就是通過(guò)反射創(chuàng)建對(duì)象,其中需要注意的有兩點(diǎn)

1)對(duì)于一個(gè)Bean初始化時(shí)需要掃描Bean中的所有變量,如果內(nèi)部還有依賴注入的嵌套對(duì)象,需要使用遞歸,直到?jīng)]有需要注入的Field

2)我這里使用的是單例模式,因?yàn)樵跍y(cè)試過(guò)程中可能存在在A類中對(duì)B進(jìn)行依賴注入,在B類中對(duì)A進(jìn)行依賴注入,常規(guī)創(chuàng)建過(guò)程,如果使用遞歸進(jìn)行掃描,就會(huì)進(jìn)入死循環(huán),內(nèi)存溢出,所以使用對(duì)象的單例,一旦創(chuàng)建就放入字典中,如果再次掃描到該對(duì)象需要注入,則直接取出使用,就避免了循環(huán)引用

3.其他

對(duì)其他不在Controller中使用的類需要依賴注入,則需要直接從IOC的Bean容器取出使用

private AuthUtil @AuthUtil = InjectUtil.Container.Resolve();

名稱欄目:通過(guò)ASP.NET實(shí)現(xiàn)依賴注入
瀏覽路徑:http://www.5511xx.com/article/ccdehed.html