标签:
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了!
当然,还远远不止这些功能,比如条件绑定之类的,如果想获取更多详情,可以到官网上研究文档
标签:
原文地址:http://www.cnblogs.com/blackerXHunter/p/4544002.html