协奏曲第一曲-Ninject绑定

Ninject可以从Nuget包中轻松搜索到,安装步骤就不演示了。这个类简单来说就是可以使接口绑定到实现。比如,我们定义了一个仓库的抽象接口:

public interface IBlogRepository {
        IQueryable<Blog> Blogs { get; }
    }

之后,如果我们想调用这个接口的功能必须先实现它,我们可以创建一个测试类,自己在里面填满数据,或者创建数据库相关的类,从数据库中得到数据。一般是可以用EF实现的:

public class EFBlogRepository:IBlogRepository {
        private EFDbContext context = new EFDbContext();
        public IQueryable<Blog> Blogs {
            get { context.Blogs; }
        }
    }

然后再具体调用:

class MyClass {
        private IBlogRepository blogRepository = new EFBlogRepository();
    }

那么,有什么办法可以不显示实例化么?有的,就是绑定实现。以asp.net mvc为例,在控制器中,我们定义了如下构造方法:

private IBlogRepository blogRepo;
        public ManagerController(IBlogRepository repo) {
            blogRepo = repo;
        }

接下来我们不做任何事情!只是将仓库里的数据传入到View方法中。照常规来看这一般会抛出一个空引用异常。

public ActionResult Index()
        {
            return View(blogRepo.Blogs);
        }

但是,神奇的一幕出现了,数据全部展示到了页面上。这是怎么回事,原因就是Ninject+DI注入。

由于DI注入我也不怎么懂,所以大家可以看出一个在程序一开始就执行的方法就可以了,还可以自动让接口实现。我们首先实现DI接口-IDependencyResolver以及添加Ninject绑定逻辑。

public class NinjectDependencyResolver:IDependencyResolver {

        private IKernel kernel;

        public NinjectDependencyResolver() {
            kernel = new StandardKernel();
            AddBindings();
        }

        private void AddBindings() {
            kernel.Bind<IBlogRepository>().To<TestBlogRepository>();
        }

        public object GetService(Type serviceType) {
            return kernel.TryGet(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType) {
            return kernel.GetAll(serviceType);
        }
    }

首先,我们初始化了一个IKernel对象,然后再初始化时把IBlogRepository接口bind到了TestBlogRepository实现上,下面的两个函数照抄就行。于是乎,现在所有的IBlogRepository接口都转化到了这个实现上,哦,当然,你还得注册这个实现:

public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            // Code that runs on application startup
            AreaRegistration.RegisterAllAreas();

            DependencyResolver.SetResolver(new NinjectDependencyResolver());

            GlobalConfiguration.Configure(WebApiConfig.Register);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
    }

在asp.net上地Global.asax上写上这行代码就OK了!

当然,还远远不止这些功能,比如条件绑定之类的,如果想获取更多详情,可以到官网上研究文档

时间: 2024-07-30 16:41:04

协奏曲第一曲-Ninject绑定的相关文章

第一曲-控制器简介

控制器是维护MVC的灵魂所在,当我们创建一个MVC程序时,vs会自动创建一个Controllers的文件夹,如果你这时候右击它,并移动到Add上,便会看见Controller,点击它,并取名为HomeController,确定之后你会看见这样的页面. public class HomeController : Controller { // GET: Home public ActionResult Index() { return View(); } } 是的,一个继承了Controller类

Ninject

Ninject Ninject之旅之八:Ninject插件模型 摘要: 在前面的章节中,我们看了在单一的绑定条件下Ninject能够处理依赖类型,就是说,每个服务类型只绑定到单一的实现类型.然而,有些情况下我们需要绑定一个抽象服务类型到多个实现,这叫多个绑定.多个绑定有两种情况.第一个是插件模型实现,另一个是上下文绑定.这篇文章介绍插件模型实现,下一篇文章介绍上下文绑定.阅读全文 posted @ 2016-11-16 21:46 丹尼大叔 阅读(121) | 评论 (0) 编辑 Ninject

绑定服务学习

绑定服务主要是其他组件绑定服务(比如活动),然后发送请求,接收返回.这个服务主要是作为其他组件的佣人,不会再后台无限 地运行.个人认为关键要学习的是如何绑定以及服务和组件之间的通信. 如何绑定到服务 一个绑定的服务是Service类的实现,允许其他组件绑定和他通信.要为服务提供绑定,必须实现onBind回调方法.这个方法返回IBinder, 定义了客户端可以和服务通信的程序接口. 客户端可以调用bindService绑定到service上,要这么做必须提供ServiceConnection的实现

springmvc(2)--参数绑定

一.以实例来看springmvc各种参数绑定方式 先定义个dto类: public class RestInDto implements Serializable { private static final long serialVersionUID = -5461373449802431627L; private String userName; private BigDecimal salary; private boolean isVip; private int id; ......

【ASP.NET MVC 学习笔记】- 05 依赖注入工具Ninject

本文参考:http://www.cnblogs.com/willick/p/3223042.html 1.Ninject是一款轻量级的DI工具,可通过VS的插件NuGet将其引用到项目中. 2.使用Ninject的步骤: 创建一个Ninject的内核对象 //创建Ninject内核实例 IKernel ninjectKernel = new StandardKernel(); 把公开接口绑定到一个实现了该接口的类上 //绑定接口到实现了该接口的类.这种绑定告诉Ninject,当接收到一个请求IV

jquery事件绑定(2)

Jquery中绑定事件有三种方法,下面是三种方式绑定 (1)element.click(function(){}); (2)element.bind("click",function(){}); (3)element.live("click",function(){}); 注意第一种方式绑定和之前的差不多,(这里节约了一个关键字on)注意API中这么写的$("p").on("click", function(){alert(

Ninject框架的介绍

Ninject是C#语言的一款依赖性的注入器框架,我认为之所以会出现这个框架是因为类与类由于继承或者接口与类继承而出现的,首先这 个最典型存在是因为接口,首先我们来看看这个用了框架和没有用框架的区别吧.首先声明一个IDiscountHeler接口,然后用一个类继承接口 public interface IDiscountHelper { int ApplyDiscount(int totalParm); } public class DeafaultDiscountHelper : IDisco

JS绑定种类汇总

这里是<你不知道的JS>中常见的this绑定种类分享: 1)默认绑定: function foo(){ console.log(this.a); } var a = 2; foo();//2 解析:foo()是直接使用不带任何修饰的函数引用进行调用的,因此只能使用默认绑定,this指向全局对象 注意:严格模式下与foo()的调用位置无关:引擎会抛出TypeError: this is undefined的异常 2)隐式绑定: function foo(){ console.log(this.a

Ninject简介(转)

1.为什么要用Ninject? Ninject是一个IOC容器用来解决程序中组件的耦合问题,它的目的在于做到最少配置.其他的的IOC工具过于依赖配置文件,需要使用assembly-qualified名称来进行定义,庸长且复杂常常因为打错字而破坏程序.这些是他的优点,也是为什么要选择它.Ninject同时不能进行热插拔. 2.Ninject做些什么? 其实Ninject做的事情很简单,说白了就是为我们选择一个想要的类来处理事务.来看下面的简单的例子. public class Product {