MVC 依赖注入

本人主要是写给我自己看的,文章没有过多的解释,只留下步骤。

目的:面向接口编程,做到低耦合,高内聚

1.利用Nuget 管理工具,安装Ninject。

2.随便新建一个接口和一个实现类,我在此项目中是新建了一个ITextHelper接口和TextHelper实现类,定义方法GetString,代码代码如下。

public class TextHelper:ITextHelper
    {
        public string GetString(string text)
        {
            return text;
        }
    }

2.新建一个NinjectControllerFactory类,并继承DefaultControllerFactory(用来实例化控制器的工厂类),注意DefaultControllerFactory是在System.Web.Mvc的命名空间下面的,注册绑定ITextHelper与TextHelper的关系,并重写GetControllerInstance方法,代码如下:

 public class NinjectControllerFactory : DefaultControllerFactory
    {
        IKernel ninjectKernel;
        public NinjectControllerFactory()
        {
            ninjectKernel = new StandardKernel();
            ninjectKernel.Bind<Services.ITextHelper>().To<Services.TextHelper>();
        }
        protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
        {
            return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType);
        }
    }

3.新建一个TextController控制器,在TextController的构造函数里面,将ITextHelper 对象作为参数传进来,因为NinjectControllerFactory工厂类已经实例化了TextHelper对象,

在这里,你可以看到这里面只能看到ITextHelper,并看不到 ITextHelper的实现类,下次要修改啥业务,就不用动控制器了,完全做到分离,这样是不是变得更好维护了?!。

    public class TextController : Controller
    {
        ITextHelper txtHelper;

        public TextController(ITextHelper txtHelper)
        {
            this.txtHelper = txtHelper;
        }

        public ActionResult Index()
        {
            ViewBag.Str = txtHelper.GetString("高内聚,低耦合");
            return View();
        }

    }

4.新建一个视图index.cshtml,

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        @ViewBag.Str(这是来自服务器的消息)
    </div>
</body>
</html>

5.最后一步,在Global.asax 的Application_Start方法里面设置我们自定义的控制器工厂,其实就是加一行代码:

ControllerBuilder.Current.SetControllerFactory(new Factory.NinjectControllerFactory());

protected void Application_Start()
        {

            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            ControllerBuilder.Current.SetControllerFactory(new Factory.NinjectControllerFactory());
        }

运行:

时间: 2024-10-22 14:28:15

MVC 依赖注入的相关文章

在mvc中使用Ninject进行依赖注入

说到依赖注入 ,首先要提到控制反转,控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的原则,目的是来削减计算机程序的耦合问题控制反转一般分为两种类型, 依赖注入(Dependency Injection,简称DI)和依赖查找.两者的区别在于,前者是被动的接收对象,在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来判断将不同的对象注入到不同的 属性中,而后者是主动索取响应名称的对象,获得依赖对象的时间也可以在代码中自由控制.但是依赖注入的应用

Autofac 依赖注入框架

Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高. 官方网站http://autofac.org/ 优点:依赖注入不是目的,它是一系列工具和手段,最终的目的是帮助我们开发出松散耦合(loose coupled).可维护.可测试的代码和程序.这条原则的做法是大家熟知的面向接口,或者说是面向抽象编程. 方法一:注册组件,Register Components var builder = new Contain

WebAPI2使用AutoFac依赖注入完整解决方案。

WebApi2上进行依赖注入,在百度里能搜到的的完整解决方案的文章少之又少,缺胳膊断腿. 和MVC5依赖注入的不同之处,并且需要注意的地方,标记在注释当中.上Global代码: namespace S2S.WebApi { public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { //----AutoFac DI------ var builder = ne

依赖注入的威力,.NET Core的魅力:解决MVC视图中的中文被html编码的问题

有园友在博问中提了这样一个问题 —— .NET Core 中文等非英文文字html编码输出问题,到我们的 ASP.NET Core 项目中一看,也是同样的问题. 比如下面的Razor视图代码: @{ ViewBag.Title = "代码改变世界"; } <title>@ViewBag.Title</title> 输出的html代码变成了: <title>代码改变世界</title> 上面的 @ViewBag.Title 实际上等同于下面

007.ASP.NET MVC控制器依赖注入

原文链接:http://www.codeproject.com/Articles/560798/ASP-NET-MVC-Controller-Dependency-Injection-for-Be 前言:在这篇文章中,我将通过一个demo,直截了当地说明依赖注入在MVC框架中的使用. 内容列表: 1.介绍 2.为什么使用控制器依赖注入 3.控制器静态结构 4.自定义控制器 5.Framework中控制器的创建 6.为什么使用控制器工厂模式 7.控制器工厂模式 7.1.目标1 7.2.目标2 8.

MVC Castle依赖注入实现代码

1.MVc 实现依赖注入 public class WindsorControllerFactory : DefaultControllerFactory { private readonly IKernel _kernel; public WindsorControllerFactory(IKernel kernel) { _kernel = kernel; } protected override IController GetControllerInstance(System.Web.Ro

6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pattern-and-dep/ 系列目录: Relationship in Entity Framework Using Code First Approach With Fluent API[[使用EF Code-First方式和Fluent API来探讨EF中的关系]] Code First Mig

.Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下,还是解耦吧,本来按照软件设计模式就应该是高内聚低耦合的,低耦合使项目的模块独立于其他模块,增加了可维护性和移植性! 注:前面写的博客详细记录没项目操作的每一步,其实写起博客来很费时间,而且整片博文里很多无用的信息.对MVC来说会添加控制器,添加视图,添加类这些都最基本的要求了,并且前面博文里都写了,

MVC进阶之路:依赖注入(Di)和Ninject

MVC进阶之路:依赖注入(Di)和Ninject 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只定义一个注入点.在程序运行过程中,客户类不直接实例化具体服务类实例,而是客户类的运行上下文环境或专门组件负责实例化服务类,然后将其注入到客户类中,保证客户类的正常运行. 图1 如图1所示,数据库操作类DataManager中依赖的IDataBase的接口,而不是以来IDataBase的具