我正在尝试向我的上级编写的N层应用程序学习。数据访问和业务层的目标框架是.NET Standard 2.0,但是在这些层的依赖关系中,有来自Microsoft.AspNetCore的库! .Net Standart目标为何可以引用.Net Core库?
答案 0 :(得分:1)
.NET Standard只是受支持的API的编纂,类似于.NET Framework / .NET Core / etc中的代码接口。是该接口的实现。就像在代码中使用接口一样,您可以将接口的任何实现强制转换为接口,但是,您只能使用该接口提供的功能的最小公分母。代码中的基本思想:
public interface INetStandard
{
public void StandardMethod();
}
public class NetFramework : INetStandard
{
public void StandardMethod() { ... }
public void FrameworkMethod() { ... }
}
public class NetCore : INetStandard
{
public void StandardMethod() { ... }
public void CoreMethod() { ... }
}
定向.NET Standard与向上转换到该接口类似。在上面的代码中,这意味着您可以访问StandardMethod
,但您将不能使用FrameworkMethod
/ CoreMethod
,无论实际的类型是什么
至于在.NET Standard中使用类似.NET Core库的东西,实际上并不是您在做什么。您提到的NuGet包之类的库通常是多目标的,例如同时使用.NET Standard和.NET Core作为目标。这实际上是一个保证,尽管该库旨在用于.NET Core,但不会使用任何特定于.NET Core的API。或者,如果这样做的话,这样做的方式不会破坏.NET Standard目标(通过使用指令等)。无论哪种情况,都可以安全地包含在.NET Standard库中,因为它仅使用.NET Standard支持的功能。尽管我不知道具体情况如何,但是完全有可能像ASP.NET Core NuGet包那样,而您实际上不能包含在.NET Standard库中。如果它不是专门针对.NET Standard,那么它将无法正常工作。
.NET Framework的工作原理类似,但也是特例。因为有许多针对.NET Framework的较早的库实际上与.NET Standard完全兼容,所以Visual Studio特别允许您放入它们,即使它们并非专门针对.NET Standard。但是,当您执行此操作时,您会得到一条警告,该警告提醒您,仅因为您被允许执行此操作,并不意味着它实际上会起作用。然后,您必须进行自己的测试,以确保库可以正常运行并且所有内容都能正确编译。这样,较旧的库就不会强制全部升级,特别是因为实际上许多库现在可能不被支持或被放弃。
总之,.NET Standard库只能真正依赖于其他.NET Standard库。之所以可以使用这些Core软件包,是因为它们除了.NET Core之外还针对.NET Standard。由于特殊的例外,仅允许以.NET Framework为目标的库被允许,并且不能保证能正常工作。