溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NET MVC 控制器激活(二)

發布時間:2020-07-11 15:54:28 來源:網絡 閱讀:866 作者:jinyuan0829 欄目:編程語言

ASP.NET MVC 控制器激活(二)

前言

在之前的篇幅中,用文字和圖像來表示了控制器的激活過程,描述的角度都是從框架默認實現的角度去進行描述的,這樣也使得大家都可以清楚的知道激活的過程以及其中涉及到的對象模型,今天的篇幅就是在激活的過程中,框架提供了哪些可注入點,站在一個使用者的角度來進行描述。

 

激活控制器-注入點入口

ASP.NET MVC 控制器激活(二)

如上圖,這是上個篇幅中描述的控制器激活過程圖,這里引用過來是怕有的朋友忘記了前面的所說和沒看過前面篇幅的朋友。

 

就從默認控制器工廠的實現來看,在CreateController()方法中,通過GetControllerType()方法來獲取控制器類型(Type),然后傳遞到GetControllerInstance()方法中,通過其中的實現來完成根據控制器類型(Type)到IController的生成。而在后續的注入點也是在GetControllerInstance()方法實現中來進行注入的,GetControllerInstance()方法即是整個控制器激活過程的入口點。

IoC示例

既然說到了動態注入,想必就要用到IoC框架了,在MVC學前篇中提到過Ninject的使用,下面這個示例便是依賴于Ninject的來做的演示:

1     /// <summary>
2     /// 產品實體類
3     /// </summary>
4     public class Product
5     {
6         public string ID { get; set; }
7         public string Name { get; set; }
8     }

定義一個數據實體類沒什么好說的,

 1     /// <summary>
 2     /// 抽象數據提取庫
 3     /// </summary>
 4     public interface IDataStandard
 5     {
 6         List<Product> GetProducts();
 7     }
 8     /// <summary>
 9     /// 默認實現--數據提取庫
10     /// </summary>
11     public class DataProvide : IDataStandard
12     {
13 
14         public List<Product> GetProducts()
15         {
16             List<Product> products = new List<Product>() 
17             {
18                 new Product(){ ID="1",Name="name1"},
19                 new Product(){ID="2",Name="name2"},
20                 new Product(){ID="3",Name="name3"}
21             };
22             return products;
23         }
24     }

這里定義的一個是抽象的數據提取庫,和一個默認的實現作為演示用于提供數據用的。

 1     /// <summary>
 2     /// 抽象數據調用
 3     /// </summary>
 4     public interface IDataCall
 5     {
 6         void WriterToMonitor();
 7     }
 8 
 9     /// <summary>
10     /// 默認的數據調用實現
11     /// </summary>
12     public class DefultDataCall:IDataCall
13     {
14         private IDataStandard _DataStandard;
15 
16         public DefultDataCall(IDataStandard dataStandard)//使用構造函數方式注入 通過Ninject框架實現
17         {
18             _DataStandard = dataStandard;
19         }
20 
21         public void WriterToMonitor()
22         {
23             foreach(var data in _DataStandard.GetProducts())
24             {
25                 Console.WriteLine("Prodcut ID:" + data.ID + " Name:" + data.Name);
26             }
27         }
28     }

這里定義的是抽象的數據調用和默認的實現,我們現在要做的就是通過IoC框架來讓調用客戶端對數據調用和數據提取解耦,

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             IKernel ninject = new StandardKernel();
 6             ninject.Bind<IDataStandard>().To<DataProvide>();
 7             IDataCall dataCall = ninject.Get(typeof(DefultDataCall)) as IDataCall;
 8             if (dataCall != null)
 9             {
10                 dataCall.WriterToMonitor();
11             }
12 
13             Console.ReadLine();
14         }
15     }

運行這段代碼:

ASP.NET MVC 控制器激活(二)

很簡單明了的一個示例,在MVC的項目中也是這樣運行的。

 

MVC項目中的運用

在上面的章節里說過,入口點在protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType);方法中,我們只需要實現一個默認的控制器工廠類型,并且重寫一下這個方法,因為我們已經可以在重寫的方法中獲取到控制器的類型了,有了它就可以按照IoC示例中的那樣來進行其它對象到控制器的一個動態注入。

我們先要定義一個控制器,并且要讓它對上述示例中的抽象提取庫依賴,采取構造函數式注入(依賴)。

看一下示例:

 1     public class IoCDemoController : Controller
 2     {
 3         //
 4         // GET: /IoCDemo/
 5 
 6         private IDataStandard _DataStandard;
 7 
 8         public IoCDemoController(IDataStandard dataStandard)
 9         {
10             _DataStandard = dataStandard;
11         }
12 
13         public ActionResult Index()
14         {
15             return View(_DataStandard.GetProducts());
16         }
17     }

在Index方法上右鍵,點擊添加視圖:

ASP.NET MVC 控制器激活(二)

點擊添加,并且在視圖中輸入如下代碼:

@model IEnumerable<ConsoleApplication2.Product>
@{
    ViewBag.Title = "Index";
}
<h3>Index</h3>
@foreach (var item in Model)
{
   <h4>ID: @item.ID Name:@item.Name</h4>
}

再把Global.asax文件中的路由設置修改一下:

1 routes.MapRoute(
2                 "Default", // 路由名稱
3                 "{controller}/{action}/{id}", // 帶有參數的 URL
4                 new { controller = "IoCDemo", action = "Index", id = UrlParameter.Optional } // 參數默認值
5             );

這個時候準備工作都做好,可是控制器中所用的數據哪里來呢?從我們默認實現的控制器工廠中來:

  1     public class NinjectControllerFactory :DefaultControllerFactory
 2     {
 3         private IKernel _NinjectKernel;
 4 
 5         public NinjectControllerFactory()
 6         {
 7             _NinjectKernel = new StandardKernel();
 8             _NinjectKernel.Bind<IDataStandard>().To<DataProvide>();
 9         }
10 
11         protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
12         {
13             IController controller = _NinjectKernel.Get(controllerType) as IController;
14             if (controller != null) 
15             {
16                 return controller;
17             }
18             return null;
19         }
20 
21     }

按照上面章節中的樣式,在NinjectControllerFactory中事先綁定數據類型,等到系統執行需要用到控制器的時候會通過Ninject框架來講數據動態的注入到控制器中。

最后還要設置一項:

在Global.asax文件中的Application_Start()方法中要把我們默認的實現的控制器工廠設置到MVC框架中,

1 protected void Application_Start()
2         {
3             AreaRegistration.RegisterAllAreas();
4 
5             RegisterGlobalFilters(GlobalFilters.Filters);
6             RegisterRoutes(RouteTable.Routes);
7             ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
8         }

添加上代碼的最后一句?,F在我們就可以來看一下最終效果了。

ASP.NET MVC 控制器激活(二)

本篇就講到這里,會在下個篇幅中繼續講解其他的注入點。

 

 

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女