最有争议的帖子,IoC,Ninject,只是让事情发挥作用

时间:2011-03-28 10:27:25

标签: architecture dependency-injection ninject ioc-container

我从哪里开始?

在学习程序的过程中,我遇到了设计模式,架构选择等。对于我来说,我从概念上理解DI,IoC以及它们为何需要/好。模块化,低耦合高凝聚力 - 我明白了。

例如,我正在使用MVP模式构建一个小型测试网站,其中演示者没有具体的视图,但使用View实现的接口。它还有一个服务层(位于演示者和BLL之间)的引用,同样没有什么具体的,使用一个接口。所有好东西。

(手动)IoC正在向上推动具体对象的实例化,以至于对象需要在某个地方注入。换句话说,依赖性仍然存在,它只是更高。输入IoC容器。并进入沮丧状态。

我知道他们在那里,我知道他们用的是什么。我选择使用ninject。凉。所以,我开始寻找。在我的下载中,我有一堆文件:

  • LICENSE.TXT
  • Ninject.dll
  • Ninject.pdb
  • Ninject.xml

另一个名为extensions

的文件夹
  • CommonServiceLocator.NinjectAdapter.dll
  • CommonServiceLocator.NinjectAdapter.pdb

好的......一堆文件。哪个用?我不知道。我在哪里放置它们?我需要所有这些吗?问题问题......

也许阅读一些手册。 Ninject wiki @ github。对。我开始阅读 - 为什么要使用Ninject?手动依赖注入,使用Ninject依赖注入 - 关于剑和匕首等的好例子。但我没有在任何地方阅读如何实际使用/使用它。我在哪里将它放在Visual Studio中?怎么称呼它?怎么样?

此外,它还提供了以下代码:

Bind<IWeapon>().To<Sword>();

它说每次调用IWeapon时都会给出剑的实现。呃......好吧,还有一把匕首 - 也许我不想每次都得到一把剑IWeapon作为我的构造函数中的参数,但是如何做到这一点?它没有说!我每次使用IWeapon时都会被一把剑困住吗?如果没有,那么改变的代码是什么呢?怎么样?

它说当你拥有一堆构造函数时,它只会占用参数最多的构造函数。好的。如果构造函数的参数比构造函数少,那么它的作用是什么呢?我不能将ninject与这些构造函数一起使用吗?或者......它是如何工作的?再一次 - 它没有在任何地方说。诅咒!

在wiki中,有一个指向SO上最有争议的帖子的链接。这是关于一个名叫乔尔的人如何说出一些关于IoC的事情,它能够引发火焰战争/书呆子。但你知道吗?我敢说我对这个人来说是个根本。为什么?也许IoC的概念很简单,但是通过上帝 - 最终知道如何使用它,在某些情况下做什么等等真的真的令人沮丧。搜索谷歌大多没有任何用处,或者确实需要阅读其中很复杂的内容。我发现那个人在某种意义上可能是正确的 - 因为很难理解概念并向那些不理解你认为简单的事情的人解释。

为什么它不能更像“下载文件 - 将这个文件拿出来并放在一个方便的位置,然后转到Visual Studio,制作一个新的地图并引用dll。使用它执行这些步骤”然后用非常详细和详细的原因解释每一步。没有代码片段。这令人沮丧。

所以,有人可能想知道我的问题是什么。好吧,我想使用Ninject。我需要什么?我在哪里放置它?我如何让它工作?在我拥有IWeapon的任何地方,我都必须被卡住吗?当太阳在外面照耀时,我在工作中做什么?

2 个答案:

答案 0 :(得分:6)

我有一套非常简单的ninject示例代码,当我们将它们引入我们的项目时,我为我们的一些开发人员制作了这些代码。它现在只涵盖基本绑定等。与其如何使用MVC或更高级的主题(如上下文绑定)无关。这一切都是作为nUnit测试完成的,所以我希望它很容易理解。它没有显示的是如何正确地将其用于您的项目。我希望很快能做一个真实的MVC项目示例。

https://github.com/ryber/Ninject-Examples

希望有所帮助。

答案 1 :(得分:2)

对于Web项目,我建议使用MVC3。有关将其与Ninject配合使用,请参阅https://github.com/ninject/ninject.web.mvc/wiki/MVC3