mls*_*lst 3 c# nuget asp.net-web-api .net-core asp.net-core
我试图在 .NET Core 术语中区分这两个概念。我将尝试用一个例子来说明我的困惑。
当我创建一个新的类库项目(例如:)时,dotnet new classlib -o myclasslib生成的.csproj文件如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。现在,如果我尝试在该项目中添加 WebApi 控制器类(例如,为了在创建的主 WebApi 应用程序中动态加载插件:),dotnet new webapi -o mywebapi我将需要使用ControllerBase类和[ApiController]属性等[HttpGet]内容。为了简单起见,我只是从 ControllerBase 派生 MyController,如下所示:
using System;
namespace myclasslib
{
public class MyController : Microsoft.AspNetCore.Mvc.ControllerBase
{
}
}
Run Code Online (Sandbox Code Playgroud)
尝试构建这个dotnet build我收到错误:
错误 CS0234:命名空间“Microsoft”中不存在类型或命名空间名称“AspNetCore”(您是否缺少程序集引用?)
这是预料之中的,因为我创建了 classlib 项目,但是如果将 .csproj 中的 SDK 更改为Sdk="Microsoft.NET.Sdk.Web"并且也更改TargetFramework为netcoreapp2.2(希望解析对ControllerBase类的引用),如下所示:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
我在构建项目时遇到同样的错误。SDK 不是应该包含构建项目所需的所有内容吗?
如果我创建通常的 webapi 项目(例如dotnet new webapi -o mywebapi),生成的内容.csproj如下所示:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
我注意到 SDK 与我设置的相同,但还添加了一个元包:<PackageReference Include="Microsoft.AspNetCore.App" />
那么,如果我们已经指定要使用 Microsoft.NET.Sdk,为什么还需要显式添加元包呢?网络?
还有一个问题:如果我们没有在 PackageReference 中指定元包版本(例如在生成的 webapi .csproj 中),则使用哪个版本的元包?
SDK 只是构建工具和 .NET Core 框架本身。ASP.NET Core 是一组 NuGet 包。本质上.NET Core 框架!= ASP.NET Core 代码。元包的概念只是无关紧要的。所谓的“ASP.NET Core”实际上是数十个单独的 NuGet 包。您可以单独引用每个内容,但正如您可以想象的那样,这既令人厌烦又容易出错。元包本质上是一个依赖于多个其他 NuGet 包的 NuGet 包。
因此,通过仅拉入元包,基本上该元包的所有依赖项也会被拉入。因此,您只需添加一个包引用即可Microsoft.AspNetCore.App开始竞争。然而,这样做的缺点是您可能会获得实际上并不需要的依赖项。对于 Web 应用程序之类的东西来说,这并不是什么大问题,因为可以修剪依赖关系,但类库不应该有过多的依赖关系。因此,您应该只从Microsoft.AspNetCore命名空间引用实际需要的各个 NuGet 包。
| 归档时间: |
|
| 查看次数: |
2354 次 |
| 最近记录: |