一起谈.NET技术,ASP.NET MVC3 让依赖注入来的更简单(新补充了Ninject示例)

简介:   昨天,我写了一篇文章(参见:ASP.NET MVC 依赖注入),这种实现方式我个人一直感觉不太顺,在写出来与大家一起分享的同时,  也是想让大家提提自己的建议, 今天下载了微软发布的最新的 ASP.

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

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

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

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

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

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

  1、实现 MVC3 Beta 中提供的依赖注入接口 IDependencyResolverMyDependencyResolver.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
        {
            
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 MVC3 Beta 版,将来正式版出来了,未必采用这种方式来实现,毕竟对于依赖注入这块,

  从 MVC1 -> MVC3 Preview1 -> MVC3 Beta 一直都在变化,微软牛人(Brad Wilson)在自己的博客中也多次提到:

 【原文链接】:http://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.html

目录
相关文章
|
6月前
|
监控 Cloud Native 测试技术
.NET技术深度解析:现代企业级开发指南
每日激励:“不要一直责怪过去的自己,他曾经站在雾里也很迷茫”。我是蒋星熠Jaxonic,一名在代码宇宙中探索的极客旅人。从.NET Framework到.NET 8,我深耕跨平台、高性能、云原生开发,践行领域驱动设计与微服务架构,用代码书写技术诗篇。分享架构演进、性能优化与AI融合前沿,助力开发者在二进制星河中逐光前行。关注我,共探技术无限可能!
.NET技术深度解析:现代企业级开发指南
|
7月前
|
前端开发 Java 开发者
MVC 架构模式技术详解与实践
本文档旨在全面解析软件工程中经典且至关重要的 MVC(Model-View-Controller) 架构模式。内容将深入探讨 MVC 的核心思想、三大组件的职责与交互关系、其优势与劣势,并重点分析其在现代 Web 开发中的具体实现,特别是以 Spring MVC 框架为例,详解其请求处理流程、核心组件及基本开发实践。通过本文档,读者将能够深刻理解 MVC 的设计哲学,并掌握基于该模式进行 Web 应用开发的能力。
1572 1
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
577 5
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
519 0
|
开发框架 .NET 程序员
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
Autofac 是一个轻量级的依赖注入框架,专门为 .NET 应用程序量身定做,它就像是你代码中的 "魔法师",用它来管理对象的生命周期,让你的代码更加模块化、易于测试和维护
663 4
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
272 6
|
开发框架 Cloud Native .NET
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
308 6
|
传感器 人工智能 供应链
.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。
本文深入探讨了.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。通过企业级应用、Web应用及移动应用的创新案例,展示了.NET在各领域的广泛应用和巨大潜力。展望未来,.NET将与新兴技术深度融合,拓展跨平台开发,推动云原生应用发展,持续创新。
215 4
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
387 3
|
敏捷开发 缓存 中间件
.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素
本文深入探讨了.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素,并通过企业级应用和Web应用开发的实践案例,展示了如何在实际项目中应用这些模式,旨在为开发者提供有益的参考和指导。
178 3