#c# #asp.net-web-api #asp.net-core #.net-core #nuget
#c# #asp.net-web-api #asp.net-core #.net-core #nuget
Вопрос:
Я пытаюсь провести различие между этими двумя понятиями в терминологии .NET Core. Я попытаюсь проиллюстрировать свое замешательство примером.
Когда я создаю новый проект библиотеки классов (например: dotnet new classlib -o myclasslib
), сгенерированный .csproj
файл выглядит следующим образом:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>
Пока все хорошо. Теперь, если я попытаюсь добавить класс контроллера WebAPI в этот проект (например. с целью динамической загрузки плагинов в мое основное приложение WebAPI, созданное как: dotnet new webapi -o mywebapi
) Мне нужно было бы использовать такие вещи, как класс ControllerBase и [ApiController]
и [HttpGet]
атрибуты. Чтобы упростить задачу, я просто извлекаю MyController из ControllerBase следующим образом:
using System;
namespace myclasslib
{
public class MyController : Microsoft.AspNetCore.Mvc.ControllerBase
{
}
}
Пытаясь создать это с помощью dotnet build
, я получаю ошибку:
ошибка CS0234: тип или имя пространства имен ‘AspNetCore’ не существует в пространстве имен ‘Microsoft’ (вам не хватает ссылки на сборку?)
Это отчасти ожидаемо, потому что я создал classlib project, но если изменить SDK в .csproj на Sdk="Microsoft.NET.Sdk.Web"
, а также изменить TargetFramework
на netcoreapp2.2
(надеясь разрешить ссылку на класс ControllerBase) следующим образом:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
</Project>
Я получаю ту же ошибку при сборке проекта. Разве 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>
Я заметил, что SDK такой же, как тот, который я установил, но также добавлен метапакет: <PackageReference Include="Microsoft.AspNetCore.App" />
Итак, зачем нам нужно явно добавлять metapackage, если мы уже указали, что хотим использовать Microsoft.NET.Sdk.Web?
Еще один вопрос: какая версия metapackage используется, если мы не указываем ее в PackageReference (например, в этом сгенерированном webapi .csproj)?
Ответ №1:
SDK — это всего лишь инструмент сборки и сама платформа .NET Core. ASP.NET Core — это набор пакетов NuGet. По существу .NET Core framework != ASP.NET Основной код. Концепция metapackages связана лишь косвенно. Что можно было бы назвать «ASP.NET «Ядро» на самом деле представляет собой десятки отдельных пакетов NuGet. Вы могли бы ссылаться на каждый из них по отдельности, но, как вы можете себе представить, это было бы утомительно и чревато ошибками. Метапакеты — это, по сути, пакет NuGet, который зависит от множества других пакетов NuGet.
Следовательно, при использовании только метапакета, по существу, все зависимости этого метапакета также извлекаются. В результате вы можете просто добавить ссылку на пакет для Microsoft.AspNetCore.App
и приступить к гонкам. Однако недостатком этого является то, что вы потенциально получаете зависимости, которые вам на самом деле не нужны. Это не такая уж большая проблема с чем-то вроде веб-приложения, потому что зависимости можно обрезать, но библиотека классов не должна иметь лишних зависимостей. Таким образом, вы должны ссылаться только на отдельные пакеты NuGet, которые вам действительно нужны, из Microsoft.AspNetCore
пространства имен.