ASP.NET MVCでコントローラをクラスライブラリに分離する実装
23299 ワード
前言
在、ASP.NET MVCの開発では、プロジェクトを作成した後、ASP.NET MVCは既にModel-Controller-Viewという形で存在していますが、プロジェクトを作成して自動的に生成されるコンテンツではModelはクラスライブラリに分離しやすいので、ここでは説明しませんが、この場合はControllerのように分離することもできるのではないでしょうか.答えは肯定的で、Controllerがどのように分離するかを検討します.
ここで私は2つの分離方法を提供して、1つは書き換え方法がIControllerFactoryインタフェースから継承して、中の方法を実現して、2つはMVCが直接ルート登録の中でコントローラの書くことを制御することを提供して、以下はこの2つのタイプについて簡単にコードを貼ります.
第一の方法
コードは以下の通りです.コードを書き終わったら、ルーティングに登録します.ヒント:実装が完了したら、ルーティング・ルール・メソッド(RegisterRoutes)に登録する必要があります.登録コードは次のとおりです.
ControllerBuilder.Current.SetControllerFactory(new ControllersFactory("BookSystem_Controllers"));//BookSystem_コントローラのクラスライブラリ
第2の方法
ルーティング登録メソッドコードは、複数のルーティングを登録するルールがある場合、namespacesプロパティの追加を覚えておく必要があります.そうしないとエラーが発生します.
在、ASP.NET MVCの開発では、プロジェクトを作成した後、ASP.NET MVCは既にModel-Controller-Viewという形で存在していますが、プロジェクトを作成して自動的に生成されるコンテンツではModelはクラスライブラリに分離しやすいので、ここでは説明しませんが、この場合はControllerのように分離することもできるのではないでしょうか.答えは肯定的で、Controllerがどのように分離するかを検討します.
ここで私は2つの分離方法を提供して、1つは書き換え方法がIControllerFactoryインタフェースから継承して、中の方法を実現して、2つはMVCが直接ルート登録の中でコントローラの書くことを制御することを提供して、以下はこの2つのタイプについて簡単にコードを貼ります.
第一の方法
コードは以下の通りです.コードを書き終わったら、ルーティングに登録します.ヒント:実装が完了したら、ルーティング・ルール・メソッド(RegisterRoutes)に登録する必要があります.登録コードは次のとおりです.
ControllerBuilder.Current.SetControllerFactory(new ControllersFactory("BookSystem_Controllers"));//BookSystem_コントローラのクラスライブラリ
1 // :
2 // <copyright file="ControllersFactory.cs">
3 // Copyright(c)2014-2034 Kencery.All rights reserved.
4 // :http://www.cnblogs.com/hanyinglong
5 // : (kencery)
6 // :2015-6-18
7 // </copyright>
8
9 using System;
10 using System.Reflection;
11 using System.Web.Mvc;
12 using System.Web.Routing;
13 using System.Web.SessionState;
14
15 namespace BookSystem_Controllers
16 {
17 /// <summary>
18 /// ,
19 /// <auther>
20 /// <name>kencery</name>
21 /// <date>2015-6-18</date>
22 /// </auther>
23 /// </summary>
24 /// :IControllerFactory :CreateController,GetControllerSessionBehavior,ReleaseController
25 /// : MVC App_Start RouteConfig RegisterRoutes ,Global.asax ,
26 /// ControllerBuilder.Current.SetControllerFactory(new ControllersFactory("BookSystem_Controllers")); //BookSystem_Controllers
27 public class ControllersFactory : IControllerFactory
28 {
29 private readonly string _assemblyName;
30 private readonly string _controlerDefaultNameSpage;
31 private Assembly _controllerAssembly;
32
33 /// <summary>
34 ///
35 /// </summary>
36 public string AssemblyName
37 {
38 get { return _assemblyName; }
39 }
40
41 /// <summary>
42 ///
43 /// </summary>
44 public string ControlerDefaultNameSpage
45 {
46 get { return _controlerDefaultNameSpage; }
47 }
48
49 /// <summary>
50 /// Assembly
51 /// </summary>
52 public Assembly ControllerAssembly
53 {
54 get
55 {
56 return _controllerAssembly ?? (_controllerAssembly = Assembly.Load(AssemblyName)); //
57 }
58 }
59
60 /// <summary>
61 ///
62 /// </summary>
63 /// <param name="assemblyName"></param>
64 public ControllersFactory(string assemblyName)
65 {
66 _assemblyName = assemblyName;
67 }
68
69 /// <summary>
70 ///
71 /// </summary>
72 /// <param name="assemblyName"></param>
73 /// <param name="controlerDefaultNameSpage"></param>
74 public ControllersFactory(string assemblyName, string controlerDefaultNameSpage)
75 {
76 _assemblyName = assemblyName;
77 _controlerDefaultNameSpage = controlerDefaultNameSpage;
78 }
79
80 /// <summary>
81 ///
82 /// </summary>
83 /// <param name="controllerName"> </param>
84 public string GetControllerFullName(string controllerName)
85 {
86 return string.Format("{0}.{1}Controller",
87 string.IsNullOrEmpty(ControlerDefaultNameSpage) ? AssemblyName : ControlerDefaultNameSpage,
88 controllerName);
89 }
90
91 /// <summary>
92 /// , controllerName , ControllerContext ,
93 /// </summary>
94 /// <param name="requestContext"></param>
95 /// <param name="controllerName"></param>
96 public IController CreateController(RequestContext requestContext, string controllerName)
97 {
98 var controller = ControllerAssembly.CreateInstance(GetControllerFullName(controllerName)) as Controller;
99 if (controller == null)
100 return null;
101 if (controller.ControllerContext == null)
102 {
103 controller.ControllerContext = new ControllerContext(requestContext, controller);
104 }
105 else
106 {
107 controller.ControllerContext.RequestContext = requestContext;
108 }
109 return controller;
110 }
111
112 /// <summary>
113 ///
114 /// </summary>
115 /// <param name="requestContext"></param>
116 /// <param name="controllerName"></param>
117 public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)
118 {
119 var controllerType = ControllerAssembly.GetType(GetControllerFullName(controllerName), true, true);
120 var sessionStateAttr =
121 Attribute.GetCustomAttribute(controllerType, typeof (SessionStateAttribute), false) as
122 SessionStateAttribute;
123 return sessionStateAttr == null ? SessionStateBehavior.Default : sessionStateAttr.Behavior;
124 }
125
126 /// <summary>
127 ///
128 /// </summary>
129 /// <param name="controller"></param>
130 public void ReleaseController(IController controller)
131 {
132 var idDisposable = controller as IDisposable;
133 if (idDisposable != null)
134 {
135 idDisposable.Dispose();
136 }
137 }
138 }
139 }
第2の方法
ルーティング登録メソッドコードは、複数のルーティングを登録するルールがある場合、namespacesプロパティの追加を覚えておく必要があります.そうしないとエラーが発生します.
1 //
2 routes.MapRoute(
3 name: "Default",
4 url: "{controller}/{action}/{id}",
5 defaults: new {controller = "Login", action = "Index", id = UrlParameter.Optional},
6 namespaces: new string[] {"BookSystem_Controllers"}
7 );