码迷,mamicode.com
首页 > 其他好文 > 详细

协奏曲第一曲-Ninject绑定

时间:2015-07-20 19:02:43      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

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了!

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

协奏曲第一曲-Ninject绑定

标签:

原文地址:http://www.cnblogs.com/blackerXHunter/p/4544002.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!