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());
        }
原文地址:https://www.cnblogs.com/jamestuhao/p/4285284.html