在.NET Core中使用Ninject

20

我正在尝试在于2016年5月发布的.NET Core平台上安装Ninject 3.3.2。但是,我遇到了一个错误:依赖项Ninject 3.2.2不支持.NETCoreApp版本v1.0的框架。 是否有人遇到过类似的问题,并且有没有解决方法?

4个回答

36

Ninject 3.3.0 在2017年9月26日发布,现在支持.NET Standard 2.0,因此也可以运行在.NET Core 2.0上。

从事情的发展过程(在GitHub上查看问题/讨论)来看,4.0-beta版本中的一些更改可能会被撤销。我认为不会很快发布4.0正式版。因此,我建议使用当前的3.x版本。


有没有任何文档或指针,介绍如何将其集成到ASP.Net Core项目中,假设目前不存在AspNetCore Ninject扩展? - SimonGates
你可以自己实现所需的接口:http://kristian.hellang.com/third-party-dependency-injection-in-asp-net-core/ - VMAtm
请注意,Xamarin.iOS不支持System.Reflection.Emit命名空间。这意味着对于我来说,使用为.NET Standard构建的Ninject是不可能的。我必须使用为MonoTouch构建的库。 - Joseph

16

我想要补充一下,尽管ASP.Net Core提供了内置的依赖注入,但对于更高级的场景来说是不够的。因为它不支持Ninject、AutoFac、Unity或StructureMap支持的各种功能。

目前,我知道的仅有支持完全的.NET Core的DI库是AutoFac和现在的Unity。将其添加进去非常简单,您只需要像以下这样使用IServiceProvider(从AutoFac中的依赖项)替换startup.cs中的ConfigureServices中的void即可:

首先,将startup.cs中ConfigureServices的void替换为IServiceProvider(从AutoFac中的依赖项),如下所示:

public IServiceProvider ConfigureServices(IServiceCollection services)

然后创建一个容器构建器,从 ConfigureServices 中构建和解析出 IServiceProvider:

var builder = new ContainerBuilder();
builder.Populate(services);
var container = builder.Build();
return container.Resolve<IServiceProvider>();

我有一个包装器,可以使用AutoFac模块动态加载和构建不同的配置。如果有兴趣的话,我可能会上传到GitHub之类的地方。


4
我需要补充说明的是,我发现了一个 Github 仓库,它提供了一种“适配器”,可以让你在 .NET Core 中使用 Ninject。在我看来,这有点像“绕路”,但似乎应该能够正常工作。https://github.com/dotnetjunkie/Missing-Core-DI-Extensions - Brandon
看起来 Ninject 4.0 可能会支持 .net core,尽管它仍处于 beta 版本。 - Brandon

5

Ninject不支持.NET Core。您可以查看其官网以确定是否有支持它的版本。

ASP.NET Core有自己内置的依赖注入容器。详见这里


5
这个绑定的IOC / DI非常简单。你应该使用适当的容器,如Autofac或StructureMap,只需忽略内置容器即可。 - Hrvoje Hudo
4
答案不正确(适用于Core 2.0),请查看@BatteryBackupUnit的回复。 - Jafin

2
Ninject不支持.Net Core,但我们可以使用.NET Core的依赖注入。下面是实现的步骤:
  1. 进入startup.cs,在public void ConfigureServices(IServiceCollection services)中添加services.AddTransient<Interface, Class>();
  2. 转到要应用依赖注入的控制器。
  3. 创建全局private Interface _propertyName;
  4. 将接口类型变量传递给构造函数,例如:
 public Constructor(Interface name)
 {
     _propertyName= name;
 }

现在您可以通过_propertyName访问类的成员。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接