Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 我正在为.net寻找一个简单但实用且健壮的IOC/DI框架_Dependency Injection_Inversion Of Control_Castle Windsor_Structuremap_Ninject - Fatal编程技术网

Dependency injection 我正在为.net寻找一个简单但实用且健壮的IOC/DI框架

Dependency injection 我正在为.net寻找一个简单但实用且健壮的IOC/DI框架,dependency-injection,inversion-of-control,castle-windsor,structuremap,ninject,Dependency Injection,Inversion Of Control,Castle Windsor,Structuremap,Ninject,我将在一个经验较少的开发人员的项目中使用它,所以像Spring.NET这样的复杂框架不是一个选项。我在想: 尼尼特 温莎城堡 结构图 哪一种方法可以在不丧失灵活性的情况下呈现中等的学习曲线 还有一个问题-配置的正确位置在哪里?由于内核/配置在三层ASP.NET应用程序(不是MVC!!!所有示例都使用MVC:)我使用了ninject,发现它很容易让新开发人员跟上进度。考虑从手动布线开始:请参阅。它让经验较少的开发人员对IOC/DI的基础知识有了更好的了解。我认为您拒绝spring.net是太草率了

我将在一个经验较少的开发人员的项目中使用它,所以像Spring.NET这样的复杂框架不是一个选项。我在想:

  • 尼尼特
  • 温莎城堡
  • 结构图
  • 哪一种方法可以在不丧失灵活性的情况下呈现中等的学习曲线


    还有一个问题-配置的正确位置在哪里?由于内核/配置在三层ASP.NET应用程序(不是MVC!!!所有示例都使用MVC:)

    我使用了ninject,发现它很容易让新开发人员跟上进度。

    考虑从手动布线开始:请参阅。它让经验较少的开发人员对IOC/DI的基础知识有了更好的了解。

    我认为您拒绝spring.net是太草率了。Spring提供了极其灵活的学习曲线,因此在一开始,它是一种“你从中得到你想要的东西”的方法。
    您可以从所有IoC容器中最简单的容器开始,然后转向aop、事务、单元测试或任何您想要的东西,因此复杂性逐渐增加

    这是我最近两份使用Spring的工作中的第一个卖点。其他要点包括:

    • 它不会强迫您使用它的api或改变您的体系结构。同样,这会引导您以自己的速度调整其功能
    • 非常广泛的文档

    当项目成熟时,您的开发人员也会成熟,所以spring最终会派上用场。。。(在我看来,一开始是免费的)

    除了Ninject这一伟大的产品之外,我还熟悉另外两种选择:

  • 。一些Alt.NET的人认为这有点大和复杂。作为Prism的一部分,我已经使用它好几个月了(Prism不需要使用Unity,它可以独立使用),我发现它简单明了
  • 。我发现StructureMap也有一个非常温和的学习曲线和快速上升

  • 希望这有帮助。

    我发现StructureMap非常有用,而且使用起来非常直观。我和Ninject玩了一会儿,发现不太方便,但我玩得很开心。我还建议您使用作为实际实施IOC和应用程序之间的中介。当您以后想要切换IOC/DI容器时,这就不那么麻烦了。StructureMap和Castle windsor有适配器。通过谷歌搜索,我认为Ninject 2也有一个这样的适配器。

    是我选择的容器。它允许通过lambda表达式进行注册,以获得最大的灵活性(链接中有一些很好的示例)

    它也有一个Silverlight兼容的版本。我不确定其他集装箱是否有

    至于放置,容器应该在应用程序启动期间构建。对于ASP.NET应用程序,这将位于Global.application\u Start方法中


    Autofac拥有一个使用您在启动期间构建的容器注入页面实例的功能。

    正确使用DI的好处在于,您可以推迟到最后一个负责任的时刻才决定使用哪个DI容器。在应用程序体系结构术语中,这对应于所谓的组合根,即将所有依赖项连接在一起的地方。这是

    除了compositionroot之外,整个应用程序都可以在根本不引用任何特定DI容器的情况下编写。你只需要这样

    在选择DI容器时,我知道这些适用于.NET的DI容器:

    就个人而言,到目前为止,我对Castle Windsor很满意,但我还没有获得使用所有这些容器的丰富经验。

    以下是一个ASP.NET(不是MVC)Ninject示例:

    首先,与windsor和其他基于反射的容器相比,它的速度非常快;其次,它非常灵活,但仍然具有非常可读的配置(如果您已经了解了Lamba表达式,这将花费很长时间)

    我们使用。它是.NET4.0框架的一部分(目前在候选发行版中),您可以在命名空间中找到它。codeplex站点目前仍然是最好的文档来源

    MEF的重点更多地是“可扩展性”,而不是“依赖注入”,但它使用依赖注入来实现这一点。例如,VisualStudio2010代码编辑器使用MEF来启用可扩展性


    我们使用它作为DI框架,还没有遇到任何问题(尽管我确实需要这个样本,它还不是核心的一部分)。

    如果您还熟悉任何DI框架,我会使用


    它有一个非常简单的API,可以让您快速入门。虽然很简单,但它仍然支持许多。库的设计考虑到了迁移,这意味着切换到另一个框架是相当简单的。为了证明这一点,有一个。

    不可知容器与CommonServiceLocator没有什么关系。如果您以依赖注入方式编写代码,则无需引用容器或CommonServiceLocator。请参阅Castle Windsor有Silverlight 3版本。这并不完全正确。不同的容器提供不同的功能,并从不同的角度处理不同的问题。您可以利用所选容器的强大功能(如可启动性、事件连接、类型化工厂等),而无需引用它,而是通过以某种方式设计组件。您通常可以调整其他容器来使用您的组件,但这意味着您需要编写一些附加的粘合代码来弥补其不足/差异。它几乎没有现成的功能。这是一个脚手架,你需要在上面手动编写你的整个线路。我同意Krzysztof的观点:例如,Funq不支持