ASP.NET MVC 3は依存注入をより簡単に実現
17373 ワード
昨日、私は1篇の文章を書きました(参照:ASP.NET MVC依存注入)、このような実現方式は私個人はずっとあまり順調ではありませんて、みんなと一緒に分かち合うことを書きますと同時に、
みんなに自分の提案を提出させたいので、今日マイクロソフトが発表した最新のASPをダウンロードしました.NET MVC 3 Beta版は、そのRelease Notesもよく読みましたが、
驚いたことに、MVC 3は依存注入へのサポートを増やし、IDependencyResolverインタフェースの定義を追加しました.本当にいいですね.私の元の実現よりずっとスムーズです.
やはり古い方法で、マイクロソフトの牛たちのブログを見て、すでに書いたコードがあるかどうかを見て、あるなら使って、ないなら自分で書くしかありません.結果は私を失望させて、私が愚かかもしれません.
私は完全な例を見つけることができなくて、いくつかのコードの断片だけあって、そこで、私はそれを整理してひっくり返して、少し個人の心得があって、出して、みんなと分かち合って、
高人に会ったら教えてください.次はコードの断片です.
1.MVC 3 Betaで提供する依存注入インタフェースIDependencyResolver,MyDependencyResolverを実現する.csのコード:
2、Global.asax.csに依存注入解析器DependencyResolverを設定します(これはグローバル静的クラスであり、MVC 3 Betaが追加されました):
3、Controllerのコード、HomeController.cs:
4、ITest.csコード:
5、Test.csコード:
*****注意、この文章はASPにしか適用されません.NET MVC 3 Beta版は、将来正式版が出てくるので、必ずしもこのような方式で実現するとは限らない.
MVC 1->MVC 3 Preview 1->MVC 3 Betaからずっと変化しており、マイクロソフトの牛人(Brad Wilson)も自分のブログで何度も言及しています.
Disclaimer This blog post talks about ASP.NET MVC 3 Beta, which is a pre-release version. Specific technical details may change before the final release of MVC 3.
This release is designed to elicit feedback on features with enough time to make meaningful changes before MVC 3 ships,
so please comment on this blog post or contact me if you have comments.
原文タイトル:ASP.NET MVC 3は依存注入をより簡単にする(Ninjectの例を新たに補足)
リンク:http://www.cnblogs.com/cnmaxu/archive/2010/10/13/1849972.html
みんなに自分の提案を提出させたいので、今日マイクロソフトが発表した最新のASPをダウンロードしました.NET MVC 3 Beta版は、そのRelease Notesもよく読みましたが、
驚いたことに、MVC 3は依存注入へのサポートを増やし、IDependencyResolverインタフェースの定義を追加しました.本当にいいですね.私の元の実現よりずっとスムーズです.
やはり古い方法で、マイクロソフトの牛たちのブログを見て、すでに書いたコードがあるかどうかを見て、あるなら使って、ないなら自分で書くしかありません.結果は私を失望させて、私が愚かかもしれません.
私は完全な例を見つけることができなくて、いくつかのコードの断片だけあって、そこで、私はそれを整理してひっくり返して、少し個人の心得があって、出して、みんなと分かち合って、
高人に会ったら教えてください.次はコードの断片です.
1.MVC 3 Betaで提供する依存注入インタフェースIDependencyResolver,MyDependencyResolverを実現する.csのコード:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- using Microsoft.Practices.Unity;
-
- namespace Demo
- {
- public class MyDependencyResolver : IDependencyResolver
- {
- #region IDependencyResolver
-
- /// <summary>
- ///
- /// </summary>
- private UnityContainer _unityContainer;
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="aUnityContainer"> </param>
- public MyDependencyResolver( UnityContainer aUnityContainer )
- {
- _unityContainer = aUnityContainer;
- }
-
- public object GetService( Type aServiceType )
- {
- try
- {
- return _unityContainer.Resolve( aServiceType );
- }
- catch
- {
- /// , , , null, !!!!
- return null;
- }
- }
-
- public IEnumerable<object> GetServices( Type aServiceType )
- {
- try
- {
- return _unityContainer.ResolveAll( aServiceType );
- }
- catch
- {
- /// , , , , !!!!
- return new List<object>( );
- }
- }
-
- #endregion
- }
-
- }
2、Global.asax.csに依存注入解析器DependencyResolverを設定します(これはグローバル静的クラスであり、MVC 3 Betaが追加されました):
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- using System.Web.Routing;
- using Microsoft.Practices.Unity;
-
- namespace Demo
- {
- // Note: For instructions on enabling IIS6 or IIS7 classic mode,
- // visit http://go.microsoft.com/?LinkId=9394801
-
- public class MvcApplication : System.Web.HttpApplication
- {
- public static void RegisterGlobalFilters( GlobalFilterCollection filters )
- {
- filters.Add( new HandleErrorAttribute( ) );
- }
-
- public static void RegisterRoutes( RouteCollection routes )
- {
- routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" );
-
- routes.MapRoute(
- "Default", // Route name
- "{controller}/{action}/{id}", // URL with parameters
- new { controller = "Home", action = "Index", id = UrlParameter.Optional }
- );
-
- }
-
- protected void Application_Start( )
- {
- AreaRegistration.RegisterAllAreas( );
-
- RegisterGlobalFilters( GlobalFilters.Filters );
- RegisterRoutes( RouteTable.Routes );
- //
- RegisterDependency( );
- }
-
- private static UnityContainer _Container;
- public static UnityContainer Container
- {
- get
- {
- if ( _Container == null )
- {
- _Container = new UnityContainer( );
- }
- return _Container;
- }
- }
-
- protected void RegisterDependency( )
- {
- Container.RegisterType<ITest, Test>( );
- DependencyResolver.SetResolver( new MyDependencyResolver( Container ) );
- }
- }
- }
3、Controllerのコード、HomeController.cs:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- using Microsoft.Practices.Unity;
-
- namespace Demo.Controllers
- {
- public class HomeController : Controller
- {
- [Dependency]
- public ITest Test { get; set; }
-
- public ActionResult Index( )
- {
- ViewModel.Message = Test.GetString( );
-
- return View( );
- }
-
- public ActionResult About( )
- {
- return View( );
- }
- }
- }
4、ITest.csコード:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
-
- namespace Demo
- {
- public interface ITest
- {
- string GetString( );
- }
- }
5、Test.csコード:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
-
- namespace Demo
- {
- public class Test:ITest
- {
- #region ITest
-
- public string GetString( )
- {
- return "Run demo!";
- }
-
- #endregion
- }
- }
*****注意、この文章はASPにしか適用されません.NET MVC 3 Beta版は、将来正式版が出てくるので、必ずしもこのような方式で実現するとは限らない.
MVC 1->MVC 3 Preview 1->MVC 3 Betaからずっと変化しており、マイクロソフトの牛人(Brad Wilson)も自分のブログで何度も言及しています.
Disclaimer This blog post talks about ASP.NET MVC 3 Beta, which is a pre-release version. Specific technical details may change before the final release of MVC 3.
This release is designed to elicit feedback on features with enough time to make meaningful changes before MVC 3 ships,
so please comment on this blog post or contact me if you have comments.
原文タイトル:ASP.NET MVC 3は依存注入をより簡単にする(Ninjectの例を新たに補足)
リンク:http://www.cnblogs.com/cnmaxu/archive/2010/10/13/1849972.html