2015-09-25 100 views
14

我一直非常高兴地使用Ninject很长一段时间,而且我非常喜欢它,但自ASP.NET 5MVC 6发布以来,我面临着一个困难的选择。微软公司基本上走出了门户,透露了自己的依赖注入系统;据我所知,这是一个很多批评。但是我更大的问题在于它如何影响其他图书馆。继续ASP.NET MVC 6中的Ninject支持?

another question I askedother resources online,似乎Ninject不开箱与MVC 6.工作,虽然有一个“解决方案”的详细库Microsoft.Framework.DependencyInjection.Ninject and Ninject的形式给出。这更加棘手,因为该库需要将https://www.myget.org/F/aspnetmaster/添加到您的NuGet订阅源列表中。

我已经做了一些挖掘并找到了这个库的托管位置;它看起来很好,它似乎可以从我能说的很好,但有几件事情让我感到困扰。

  • 库并没有真正出现在Ninject创
  • 库埋藏很深的一个不起眼的仓库领导
  • 实际Ninject资源在线别说

所以基本上,我非常担心这是某种形式的助手,对Ninject(甚至其他容器库)的支持正在消失。是否有一些隐藏的信息,我只是没有发现?

回答

9
  • 库并没有真正出现在Ninject 创

那个图书馆领导,而且它似乎these also,看起来是微软创建了依赖注入提供的样品是是removed in beta7。请注意,您的original question引用的DI in MVC 6链接指出以下内容;

这些DI容器适配器是临时的,供参考;我们预计他们最终将被移除并由相应的容器所有者替换为 。

因为他们应该。微软不应该负责维护第三方提供商。

  • 如果你不知道该库埋藏很深的一个不起眼的仓库

,ASP.NET 5仍然在发展。Beta 7可在nuget上作为预发布版本使用,但也有其他来源,包括:

这些来源由Microsoft维护。

  • 实际Ninject资源在线别说

正如任何新的发展,第三方库供应商必须自己决定什么时候(如果有的话),他们将提供他们的产品的实现支持新的代码库。对于一些人来说,等到新框架正式发布时才会被认为是最有效率的,因为在此之前API破解的变化仍然很有可能发生。当然,支持是否会得到实施当然取决于提供者资源,并且/或者开源社区。

38

在现有的DI库的维护人员之间正在进行讨论,无论是否构建,维护和支持新的ASP.NET内置DI系统的适配器。 Autofac维护者有confirmed,他们将创建和支持一个适配器,而Ninject团队已经,以及其他团队,如简单注入器团队(包括我)have explained,他们将不支持一个适配器。我个人认为,ASP.NET Core内置的DI库是一个不错的,干净的DI库,但它仅限于简单的应用程序。正如我所解释的here,不支持开发围绕SOLID原则构建的可维护应用程序所需的许多功能。然而,就像几年前Unity DI库做的那样,我认为这个内置容器实际上可能会触发开发人员开始使用依赖注入,这对我们这个行业来说是一个胜利。

这些限制使内置容器特别适合配置和扩展ASP.NET系统本身。要构建大型可维护应用程序,您需要使用不同的DI库。这当然很好;你将不得不为工作挑选合适的工具。

不幸的是,直到现在,ASP.NET团队已经沟通了使用不同DI库的publicly,这意味着您必须编写/使用适配器。这不幸的是IMO的错误信息,因为大多数DI库与内置容器提供的API不兼容(如我详细解释herehere)。只有Autofac似乎合理同步,这就解释了为什么Autofac团队选择维护一个适配器。但请注意,即使Autofac已被证明与Microsoft定义的抽象不兼容,并且它们(就像StructureMap)必须对其产品进行big changes才能符合抽象。关于整个过程和抽象的一般,Autofac维护者是severely frustrated。正如我解释here,即使ASP.NET提供的Ninject适配器实现也被破坏了。

这条消息由ASP.NET团队使用一个适配器是IMO的一个很大的错误,因为这扼杀了创新(而DI库本身没有;它只是另一个DI库)。 ASP。.NET团队正在推广一个模型,在该模型中,您的应用程序组件和ASP.NET系统(以及将来插件的所有其他子系统)将在您的自定义容器中注册。将您的应用程序配置与ASP.NET系统的配置分开更为合理和实用(如解释here)。

因此,我发现使用任何容器的适配器都没用。正如我所示,here真的很容易插入你自己的DI容器,同时保持它与ASP.NET的注册完全分开。这意味着您不需要支持Ninject就能够在ASP.NET Core项目上有效地使用Ninject。 Ninject唯一需要做的就是创建一个与.NET Core兼容的版本(以防您的产品需要在新平台上运行)。所以简而言之,虽然一些DI维护者(如Simple Injector团队,也可能是Castle Windsor和Ninject)选择不构建,维护,但我不确定支持是否正在消失。并支持适用于ASP.NET Core的适配器实现,因为它不是必需的,而且仅限于此。

UPDATE 2016年11月

我一直discussing some improvements到ASP.NET核心与微软使其更容易的插件,不带适配器的容器(看看我example repository,尤其是到Startup.cs of the Ninject sample project ),但直到现在,微软似乎都在阻碍进步,因为(正如福勒说的)他们的“bias towards conforming containers [他们]混淆[他们的]愿景”。

+0

感谢有见地的文章,DI容器中内置的主要缺失是没有基于约定的映射。我必须将每个项目都包含到我的启动项目中,并映射依赖关系。这似乎是一个巨大的失误,除非我失去了一些东西。 – Spets

+3

@Spets内置容器特别适用于ASP.NET本身的配置系统。所以这意味着您可以轻松地交换部分ASP.NET,并且第三方组件可以使用相同的配置模型。内置容器是围绕该模型构建的,这就解释了为什么某些功能没有实现。请注意,批量注册非常容易将自己写在容器之上,并且要成为一个引人注目的DI库,应首先实施其他更重要的功能。但是,不要滥用DI系统来注册自己的类型。 – Steven

+0

有道理。 – Spets