使用Microsoft.Extensions.DependencyInjection的.NET Framework类库

3

我有一个.NET Framework(4.5.2)的类库,我想使用Microsoft.Extensions.DependencyInjection,并且我们正在单独开发一个ASP.NET Core应用程序。

我使用NuGet安装了它,在使用Visual Studio构建时它可以正常工作,但是在尝试在TeamCity构建代理上使用MSBuild进行构建时,会出现很多这样的错误:

MyClass.cs(32, 26): error CS0012: The type 'IServiceProvider' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.ComponentModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
MyClass.cs(33, 31): error CS0012: The type 'IDisposable' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
MyClass.cs(33, 31): error CS1061: 'IServiceScope' does not contain a definition for 'Dispose' and no extension method 'Dispose' accepting a first argument of type 'IServiceScope' could be found (are you missing a using directive or an assembly reference?)
MyClass.cs(34, 10): error CS0012: The type 'IDisposable' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
MyClass.cs(34, 10): error CS0012: The type 'IServiceProvider' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.ComponentModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
MyClass.cs(35, 10): error CS0012: The type 'IDisposable' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
MyClass.cs(35, 10): error CS0012: The type 'IServiceProvider' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.ComponentModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
MyClass.cs(36, 51): error CS0012: The type 'IDisposable' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
MyClass.cs(36, 51): error CS0012: The type 'IServiceProvider' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.ComponentModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
MyClass.cs(36, 30): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.

一些Nuget软件包(比如Microsoft.Extensions.DependencyInjection自身)没有单独的net452程序集,只有netstandard1.0或netstandard1.1。这可能是问题所在吗?我在构建服务器上安装了.NET Core SDK,但没有任何效果。

1
正如在这里和这里所表达的那样,类库不应使用任何DI库。 - Steven
该库公开了一个抽象的Topshelf服务类,然后在控制台应用程序中实现,类似于ASP.NET实际上是使用DI的库。我这样做是为了避免在我们制作每个服务时都需要复制粘贴样板代码。 - Jussi Kosunen
这种方法有很多缺点,特别是当您使用.NET Core DI抽象时,它是一个符合容器。 - Steven
@JussiKosunen -“我这样做是为了避免在我们制作每个服务时都需要复制粘贴样板文件。”- 您是否为每个服务制作一个.config文件?请将组合根视为另一个(在代码中的).config文件。您不会在应用程序之间共享.config文件,那么为什么要共享组合根呢? - NightOwl888
组合根在服务中,库中没有隐式地向容器添加任何内容。该库仅提供框架和实用工具,以使体验尽可能接近 ASP.NET Core。我试图优先考虑使服务实现者的工作更轻松,而不是纠结于 ioc 容器实例化在哪个程序集中。 - Jussi Kosunen
2个回答

1

我也遇到了同样的问题,但是在将NuGet Installer作为构建步骤之后,我的所有问题都得到了解决。

你只需要做一件事,在构建项目之前 - 只需添加一个构建步骤并选择运行器类型为NuGet Installer

您可以从这些屏幕截图中检查:

enter image description here


1
在这种情况下,我已经完成了这个。所需的程序集(System.ComponentModel和System.Runtime)不作为NuGet的依赖项提供,而是需要安装Visual Studio或Developer Pack。 - Jussi Kosunen

0
原来我缺少了.NET Framework 4.5.2开发人员包,奇怪的是我的其他解决方案都没有问题。

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