Структурирование проекта ASP.NET Core для ссылки на стандартные библиотеки .Net

У меня проблемы с пониманием зависимостей фреймворка от 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 и делаю это неправильно, или, возможно, моя конфигурация просто неверна. Пожалуйста, дайте мне знать, как мне правильно создать такую ​​структуру.


person James Ferretti    schedule 07.01.2017    source источник
comment
netcoreapp1.x предназначен только для приложений, а не для библиотек классов. Приложения представляют собой общие сборки (dll или exe) с точкой входа (статический метод Main, например console, основные веб-приложения asp.net или проекты модульных тестов). При этом в ваших библиотеках классов не должно быть netcoreapp1.x, только ваше приложение. netcoreapp1.0 проект может ссылаться на netstandard1.x   -  person Tseng    schedule 07.01.2017
comment
Да, именно поэтому мне не нравится добавлять его в свои PCL, однако я не смог заставить проект скомпилировать каким-либо другим способом. Если я удалю его, компилятор скажет, что мне не хватает ссылки на мои PCL, когда я пытаюсь создать веб-API, несмотря на то, что они указаны в блоке json зависимостей.   -  person James Ferretti    schedule 07.01.2017
comment
Поиграв с этим немного больше, кажется, что добавление зависимости от .Net Standard 1.6 в API-проект. Json позволяет мне компилировать без netcoreapi1.x в PCL, однако у меня нет intellisense, и Visual Studio не может видеть ссылки на мои PCL, несмотря на это компиляция (из VS). Так что, хотя это работает, это неприемлемое решение.   -  person James Ferretti    schedule 07.01.2017
comment
Посмотрите в окно вывода, что выводит nuget / package manager во время восстановления   -  person Tseng    schedule 07.01.2017


Ответы (2)


После некоторого дальнейшего исследования и помощи M.Ob project.json я понял, что мой проект на самом деле строился правильно, и проблема исходила из ReSharper (10.0.2, мне, вероятно, следует обновить).

Отключение resharper для этого решения теперь позволило моей сборке проекта и Intellisense правильно работать для решения.

person James Ferretti    schedule 10.01.2017
comment
Да, у меня были проблемы с ReSharper 10.x.x, а также с .NET Core. Я наконец обновился до последней версии и никаких проблем не возникло. Последняя версия прекрасно интегрируется с .NET Core. - person M.Ob; 10.01.2017
comment
Присутствует в ReSharper 2017.1.3 с netcoreapp2.0, нацеленным на библиотеку netstandard2.0. - person CodeCaster; 19.06.2017

У меня есть приложение ASP.NET Core, которое разбито на множество проектов. Мое веб-приложение - единственное, что является netcoreapp1.1. Остальное все нетстандарт1.6.

Внимательно посмотрите на мои файлы project.json (в частности, на разделы, посвященные фреймворкам и зависимостям), чтобы сравнить с вашими. Вы увидите небольшие различия. Мое решение создается без проблем, и intellisense тоже работает.

Мое веб-приложение project.json выглядит так (оно довольно длинное, но я оставил все там на случай, если вам понадобится что-нибудь еще увидеть:

{
  "version": "2.0.1.0",

  "dependencies": {
    "DT.Common": "2.*",
    "DT.Configuration": "2.*",
    "DT.Services": "2.*",
    "DT.Web.ViewModels": "2.*",
    "Microsoft.ApplicationInsights.AspNetCore": "1.0.2",
    "Microsoft.AspNetCore.Authentication": "1.1.0",
    "Microsoft.AspNetCore.Authentication.Cookies": "1.1.0",
    "Microsoft.AspNetCore.Authentication.OpenIdConnect": "1.1.0",
    "Microsoft.AspNetCore.Diagnostics": "1.1.0",
    "Microsoft.AspNetCore.Mvc": "1.1.0",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.1.0-preview4-final",
      "type": "build"
    },
    "Microsoft.AspNetCore.Routing": "1.1.0",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": {
      "version": "1.1.0-preview4-final",
      "type": "build"
    },
    "Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
    "Microsoft.AspNetCore.Server.Kestrel.Https": "1.1.0",
    "Microsoft.AspNetCore.Session": "1.0.0",
    "Microsoft.AspNetCore.StaticFiles": "1.1.0",
    "Microsoft.Extensions.Caching.SqlServer": "1.0.0",
    "Microsoft.Extensions.Configuration.Abstractions": "1.1.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.1.0",
    "Microsoft.Extensions.Configuration.Json": "1.1.0",
    "Microsoft.Extensions.Logging.Console": "1.1.0",
    "Microsoft.Extensions.Logging.Debug": "1.1.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "Microsoft.Graph": "1.1.1",
    "Microsoft.IdentityModel.Clients.ActiveDirectory": "3.13.6"
  },

  "tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.1.0-preview4-final",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.1.0-preview4-final",
      "imports": "portable-net45+win8+dotnet5.6"
    },
    "Microsoft.Extensions.Caching.SqlConfig.Tools": "1.1.0-preview4-final"
  },

  "frameworks": {
    "netcoreapp1.1": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ],
      "dependencies": {
        "Microsoft.NETCore.App": {
          "version": "1.1.0",
          "type": "platform"
        }
      }
    }
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "views/**/*.cshtml",
      "appsettings.json",
      "appsettings.*.json",
      "web.config"
    ]
  },

  "scripts": {
    "prepublish": [ "bower install", "gulp buildprod" ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}

Мой уровень сервисов project.json выглядит так:

{
  "version": "2.0.1.0",

  "dependencies": {
    "DT.Common": "2.*",
    "DT.Configuration": "2.*",
    "DT.Data": "2.*",
    "DT.Models": "2.*" ,
    "DT.Web.ViewModels": "2.*",
    "Microsoft.ApplicationInsights.AspNetCore": "1.0.2",
    "Microsoft.AspNetCore.Authentication.Cookies": "1.1.0",
    "Microsoft.AspNetCore.Http.Abstractions": "1.1.0",
    "Microsoft.Extensions.Caching.Abstractions": "1.0.0",
    "Microsoft.Extensions.Options": "1.1.0",
    "Microsoft.Graph": "1.1.1",
    "Microsoft.IdentityModel.Clients.ActiveDirectory": "3.13.6"
  },

  "frameworks": {
    "netstandard1.6": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ],
      "dependencies": {
        "NETStandard.Library": "1.6.1"
      }
    }
  }
}

Мой уровень данных project.json выглядит так:

{
  "version": "2.0.1.0",

  "dependencies": {
    "DT.Configuration": "2.*",
    "DT.Data.Domain": "2.*",
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.1",
    "Microsoft.Extensions.Configuration.Abstractions": "1.1.0",
    "Microsoft.Extensions.DependencyInjection.Abstractions": "1.1.0"
  },

  "tools": {
    "Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final"
  },

  "frameworks": {
    "netstandard1.6": {
      "imports": "dotnet5.6",
      "dependencies": {
        "NETStandard.Library": "1.6.1"
      }
    }
  }
}
person M.Ob    schedule 09.01.2017
comment
Спасибо за это, это доказало мне мои первоначальные ощущения, что нет необходимости ссылаться на netcoreapp в файлах PCL project.json. Оказалось, что ReSharper сообщает об ошибке, когда в этом нет необходимости. - person James Ferretti; 10.01.2017