当前位置:编程学习 > asp >>

ASP.NET MVC3 让依赖注入来的更简单(新补充了Ninject示例)

 

昨天,我写了一篇文章(参见:ASP.NET MVC 依赖注入),这种实现方式我个人一直感觉不太顺,在写出来与大家一起分享的同时,

 

也是想让大家提提自己的建议, 今天下载了微软发布的最新的ASP.NET MVC3 Beta 版,同时也仔细阅读了它的Release Notes,

 

让我感觉到惊喜的是,MVC3增加了对依赖注入的支持,增加了一个IDependencyResolver 接口定义,真的是很不错,比起我原来的实现要顺畅很多,

 

还是老方法,上微软牛人们的博客逛一圈看看有没有已经写好的代码,有就拿来用之,没有就只能自己写了,结果让我很失望,也可能是我太笨,

 

我没有找到一个完整的示例,只有一些代码片断,于是,我将其整理了一翻,也有一点点个人的心得,拿出来,与大家分享一下,

 

如遇高人请不吝赐教,下面是代码片断。

 

1、实现MVC3 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 (这是一个全局静态类,也是MVC3 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

  &nb

补充:Web开发 , ASP.Net ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,