我正在构建一个ASP.NET Core Web API项目。我将在与SQL Server的连接中大量使用EF Core。我想围绕3个主要层次组织该项目:核心/逻辑/域,数据/基础架构和Web / API。
Web / API肯定是.NET Core项目,但我在为Core和Data项目应为.NET Core库还是.NET Standard库而苦恼。
我的问题是,在.NET Standard库中建立数据持久性时,我会丢失任何功能或任何东西吗?
答案 0 :(得分:3)
对于类库,目标框架仅指定兼容性层。最终功能来自引用类库的项目目标框架。
例如,假设您创建一个.NET Standard库,然后将其包含在.NET Framework项目中。您所做的一切都在.NET Framework上进行,并且出于所有意图和目的,您也可以从类库中定位.NET Framework。选择.NET Standard只是表明您将使用某些.NET Standard兼容目标中的API。就这样。结果,像EF Core这样的功能最终取决于您将库放入哪个库中,而不是库所针对的框架中。
关于是选择.NET Standard还是.NET Core作为库的目标框架,只需:使用.NET Standard,除非您有充分的理由不这样做。如果您以.NET Standard为目标,则可以将其放到针对与库所针对的.NET Standard版本兼容的任何框架的项目中。如果选择.NET Core,则只能在.NET Core项目中使用该库。
但是,当您开始查看.NET Core 3.0时,事情会变得更加模糊。您可以从技术上定位.NET Standard 2.1,并获得.NET Core 3.0的所有优势,但.NET Core 3.0实际上仅支持.NET Standard 2.1。您可以以.NET Standard 2.0为目标,但后来又陷于.NET Core 2.2。换句话说,如果您现在想使用.NET Core 3.0,则选择.NET Standard 2.1或.NET Core 3.0作为库的目标框架之间没有功能上的区别。无论哪种情况,它都只适用于.NET Core 3.0项目。
更令人困惑的是,Microsoft正在将.NET 5框架下的所有内容的下一个版本转移。那时尚未讨论.NET Standard的内容,我以为它会消失很多。一旦有了.NET 5,任何项目都可以以.NET 5为目标,并且可以由以.NET 5为目标的任何其他项目使用。我提出这个问题的原因是,如果您今天想使用.NET Core 3.0,那么除了.NET Core 3.0之外,针对其他任何东西都没有多大意义。 .NET Standard 2.1中的大多数内容都无法向后移植到.NET Framework和Unity之类的东西,因此它们永远不会在.NET Standard 2.1中。这些框架的前进之路是使它们与.NET Core兼容,最终最终成为.NET Core 4.0,Microsoft将其称为.NET 5。
总之,最好的性能和功能是.NET Core 3.0,只要您可以100%使用.NET Core 3.0,那么这就是您的目标。如果需要在Xamarin或.NET Framework应用程序中使用库,请坚持使用.NET Standard 2.0。
答案 1 :(得分:1)
.NET标准是.NET API的正式规范,旨在在所有.NET实现中都可用。
.NET Core是一个开源通用开发平台
这与您的问题有关。
创建.NET Standard库,假设.NET Core / Framework项目与您的.NET Standard版本保持一致,则可以将该库放入.NET Core项目或.NET Framework项目中。库或更高。因此,.NET标准库将为您提供将其拉入项目的更多灵活性(如果需要将其拉入运行在.NET Framework> = 4.6.1上的旧应用程序以及新应用程序中,则很好将以.NET Core编写)。
此方法唯一遇到的麻烦是关于迁移的问题。如果您想通过dotnet ef
命令使用EFCore迁移,则它希望您以.NET Core版本为目标。因此,如果您在.NET Standard库中创建DbContext
,并希望从中创建迁移,则必须给它一个.NET Core项目作为启动项目,或者实现一个'{{3} }'。顺便说一句,该最后一个选项确实有一些限制,其中一个限制已记录在Design-time DbContext Creation的问题中。