У меня проблемы с пониманием зависимостей фреймворка от ASP.NET Core Web API и .NET Standard PCL.
Я создаю новый веб-API (микросервис), который будет использоваться в качестве шлюза API, я создал новый проект в VS2015 (обновление 3, последние инструменты ядра .NET), и он компилируется и работает нормально.
Затем я добавил несколько проектов .NET Standard PCL, чтобы использовать их для разделения POCO, слоев репозитория и т.д. определены в моих PCL.
После некоторого исследования, которое, похоже, сводится к тому факту, что я нацелен на разные фреймворки в своих проектах, раздел фреймворков в project.json для веб-API гласит:
"frameworks": {
"netcoreapp1.0": {
"imports": [
"dotnet5.6",
"portable-net45+win8"
]
}
},
А для PCL изначально было написано:
frameworks": {
"netstandard1.6": {
"imports": "dnxcore50"
}
}
Кажется очевидным, что именно здесь возникает несовместимость.
Чтобы исправить это, я попытался сделать так, чтобы основной проект .Net ссылался на стандартную структуру .Net, чтобы он мог использовать PCL, однако все, что я пытался, не позволяло мне ссылаться на проекты.
Единственный способ заставить это работать - это сделать обратное и сделать так, чтобы библиотеки PCL ссылались на netcoreapp1.0, что кажется очень неправильным.
Мой полный стандартный .Net project.json теперь гласит:
{
"version": "1.0.0",
"dependencies": {
"NETStandard.Library": "1.6.0"
},
"frameworks": {
"netstandard1.6": {
"imports": "dnxcore50"
},
"netcoreapp1.0": {
"imports": [
"dotnet5.6",
"portable-net45+win8"
]
}
}
}
И мой полный проект .Net Core Web Api Project читает
{
"dependencies": {
"Microsoft.NETCore.App": {
"version": "1.0.1",
"type": "platform"
},
"Microsoft.AspNetCore.Mvc": "1.0.1",
"Microsoft.AspNetCore.Routing": "1.0.1",
"Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
"Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
"Microsoft.Extensions.Configuration.Json": "1.0.0",
"Microsoft.Extensions.Logging": "1.0.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",
"Microsoft.Extensions.Logging.Debug": "1.0.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
"Company.Product.Microservices.Gateway.Business": "1.0.0",
"Company.Product.Microservices.Gateway.DomainObjects": "1.0.0"
},
"tools": {
"Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
},
"frameworks": {
"netcoreapp1.0": {
"imports": [
"dotnet5.6",
"portable-net45+win8"
]
}
},
"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true
},
"runtimeOptions": {
"configProperties": {
"System.GC.Server": true
}
},
"publishOptions": {
"include": [
"wwwroot",
"**/*.cshtml",
"appsettings.json",
"web.config"
]
},
"scripts": {
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
}
Как я сказал ранее, ссылки на фреймворки здесь кажутся неправильными. Я бы предположил, что проект на основе инфраструктуры netcoreapp может напрямую ссылаться на проект, скомпилированный в .NET Standard, без необходимости самому PCL знать что-либо о netcoreapp, в конце концов, это PCL.
Как правильно структурировать такой проект? Кажется, это должна быть настройка по умолчанию для любого проекта ASP.NET Core, однако до сих пор это было непросто настроить, и я не могу найти никакой документации, относящейся к этому конечно обычный сценарий. Возможно, это потому, что я неправильно понимаю Core и Standard и делаю это неправильно, или, возможно, моя конфигурация просто неверна. Пожалуйста, дайте мне знать, как мне правильно создать такую структуру.
netcoreapp1.x
предназначен только для приложений, а не для библиотек классов. Приложения представляют собой общие сборки (dll или exe) с точкой входа (статический метод Main, например console, основные веб-приложения asp.net или проекты модульных тестов). При этом в ваших библиотеках классов не должно бытьnetcoreapp1.x
, только ваше приложение.netcoreapp1.0
проект может ссылаться наnetstandard1.x
- person Tseng   schedule 07.01.2017netcoreapi1.x
в PCL, однако у меня нет intellisense, и Visual Studio не может видеть ссылки на мои PCL, несмотря на это компиляция (из VS). Так что, хотя это работает, это неприемлемое решение. - person James Ferretti   schedule 07.01.2017