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のコード:

  
  
  
  
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using Microsoft.Practices.Unity;
  7. namespace Demo
  8. {
  9. public class MyDependencyResolver : IDependencyResolver
  10. {
  11. #region IDependencyResolver
  12. /// <summary>
  13. ///
  14. /// </summary>
  15. private UnityContainer _unityContainer;
  16. /// <summary>
  17. ///
  18. /// </summary>
  19. /// <param name="aUnityContainer"> </param>
  20. public MyDependencyResolver( UnityContainer aUnityContainer )
  21. {
  22. _unityContainer = aUnityContainer;
  23. }
  24. public object GetService( Type aServiceType )
  25. {
  26. try
  27. {
  28. return _unityContainer.Resolve( aServiceType );
  29. }
  30. catch
  31. {
  32. /// , , , null, !!!!
  33. return null;
  34. }
  35. }
  36. public IEnumerable<object> GetServices( Type aServiceType )
  37. {
  38. try
  39. {
  40. return _unityContainer.ResolveAll( aServiceType );
  41. }
  42. catch
  43. {
  44. /// , , , , !!!!
  45. return new List<object>( );
  46. }
  47. }
  48. #endregion
  49. }
  50. }

2、Global.asax.csに依存注入解析器DependencyResolverを設定します(これはグローバル静的クラスであり、MVC 3 Betaが追加されました):

  
  
  
  
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using System.Web.Routing;
  7. using Microsoft.Practices.Unity;
  8. namespace Demo
  9. {
  10. // Note: For instructions on enabling IIS6 or IIS7 classic mode,
  11. // visit http://go.microsoft.com/?LinkId=9394801
  12. public class MvcApplication : System.Web.HttpApplication
  13. {
  14. public static void RegisterGlobalFilters( GlobalFilterCollection filters )
  15. {
  16. filters.Add( new HandleErrorAttribute( ) );
  17. }
  18. public static void RegisterRoutes( RouteCollection routes )
  19. {
  20. routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" );
  21. routes.MapRoute(
  22. "Default", // Route name
  23. "{controller}/{action}/{id}", // URL with parameters
  24. new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  25. );
  26. }
  27. protected void Application_Start( )
  28. {
  29. AreaRegistration.RegisterAllAreas( );
  30. RegisterGlobalFilters( GlobalFilters.Filters );
  31. RegisterRoutes( RouteTable.Routes );
  32. //
  33. RegisterDependency( );
  34. }
  35. private static UnityContainer _Container;
  36. public static UnityContainer Container
  37. {
  38. get
  39. {
  40. if ( _Container == null )
  41. {
  42. _Container = new UnityContainer( );
  43. }
  44. return _Container;
  45. }
  46. }
  47. protected void RegisterDependency( )
  48. {
  49. Container.RegisterType<ITest, Test>( );
  50. DependencyResolver.SetResolver( new MyDependencyResolver( Container ) );
  51. }
  52. }
  53. }

3、Controllerのコード、HomeController.cs:

  
  
  
  
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using Microsoft.Practices.Unity;
  7. namespace Demo.Controllers
  8. {
  9. public class HomeController : Controller
  10. {
  11. [Dependency]
  12. public ITest Test { get; set; }
  13. public ActionResult Index( )
  14. {
  15. ViewModel.Message = Test.GetString( );
  16. return View( );
  17. }
  18. public ActionResult About( )
  19. {
  20. return View( );
  21. }
  22. }
  23. }

4、ITest.csコード:

  
  
  
  
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace Demo
  6. {
  7. public interface ITest
  8. {
  9. string GetString( );
  10. }
  11. }

5、Test.csコード:

  
  
  
  
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. namespace Demo
  6. {
  7. public class Test:ITest
  8. {
  9. #region ITest
  10. public string GetString( )
  11. {
  12. return "Run demo!";
  13. }
  14. #endregion
  15. }
  16. }

*****注意、この文章は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