zoukankan      html  css  js  c++  java
  • 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,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    @{
        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());
            }
  • 相关阅读:
    洛谷 P1383 高级打字机==codevs 3333 高级打字机
    洛谷 P1525 关押罪犯==codevs 1069 关押罪犯[NOIP 2010]
    洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]
    poj1426
    3049 舞蹈家怀特先生
    1444 “破锣摇滚”乐队
    cocos2d-x开发的《派对小游戏》-github源代码分享
    【c语言】字符串替换空格:请实现一个函数,把字符串中的每一个空格替换成“%20”
    CAP理论与HBase
    也谈以人为本—— 服务型企业的管理随想
  • 原文地址:https://www.cnblogs.com/jamestuhao/p/4285284.html
Copyright © 2011-2022 走看看