Microsoft.AspNet.Identity и Microsoft.AspNet.Identity.EntityFramework в .NET Standard 2.0 - PullRequest
0 голосов
/ 09 ноября 2018

Справочная информация. Проект, над которым мы работаем, состоит из нескольких решений, которые совместно используют две библиотеки . Сегодня все написано в .NET Framework 4.6.1. Целью проекта было принятие .NET Core для новых проектов и возможность запуска веб-приложений в Docker.

С новым выпуском .NET Standard 2.1 и тем фактом, что .NET Framework 4.8 останется на .NET Standard 2.0 вместо реализации .NET Standard 2.1, пришло время начать. Иммо Ландверт из Microsoft говорит так:

Но также верно то, что уровень инноваций в .NET Framework должен замедлить, чтобы уменьшить поломку. В этом смысле вы следует ожидать, что большинство новых функций доступны на .NET Core (и производных платформах, таких как Xamarin, Mono, и Unity, созданный из тех же источников, что и .NET Core).

https://blogs.msdn.microsoft.com/dotnet/2018/11/05/announcing-net-standard-2-1/

Мы хотели бы получить доступ к новым функциям в наших новых проектах, но не хотим преобразовывать каждый старый проект в .NET Core. Чтобы сохранить совместимость между .NET Framework и .NET Core, мы решили преобразовать наши общие библиотеки в .NET Standard 2.0.

https://docs.microsoft.com/en-us/dotnet/standard/net-standard

Это сработало очень хорошо, за исключением следующих зависимостей:

1. System.Net.Http.WebRequestHandler - решено

Используется для клиентских сертификатов, таких как:

WebRequestHandler requestHandler = new WebRequestHandler();

//Add certificate if setting exists
if (!string.IsNullOrEmpty(pushEvent?.CertificateThumbprint?.Thumbprint))
{
    var certificate = certificateService.GetClientCertificate(pushEvent?.CertificateThumbprint?.Thumbprint);
    if (certificate != null)
    {
        requestHandler.ClientCertificates.Add(certificate);
    }
}

var client = new HttpClient(requestHandler);

Я нашел для него NuGet, но он кажется вредоносным. Пакет ссылается на документацию Microsoft как сайт проекта и содержит ошибку Microsoft как автора, Microsfot. Об этом сообщили, так что Microsoft может взглянуть на это.

https://www.nuget.org/packages/WebRequest.WebRequestHandler/

Однако, похоже, мы можем изменить WebRequestHandler на HttpClientHandler, чтобы получить его из коробки.

2. System.Runtime.Remoting.Messaging -> CallContext.LogicalGetData - решено

Решено здесь: https://stackoverflow.com/a/53211839/3850405

3. Microsoft.AspNet.Identity.EntityFramework.IdentityUser

У нас есть модель пользователя, которая наследуется от IdentityUser.

public class AppUser : IdentityUser, ICurrentUser
{
    public bool LocalEnvironment { get; set; }

    public Guid? TokenId { get; set; }
}

4. Microsoft.AspNet.Identity.UserManager из сборки Microsoft.AspNet.Identity.Core

Мы сохраняем наш UserManager общий для проектов. Container от SimpleInjector, который совместим с .NET Standard 2.0.

public class AppUserManager : UserManager<AppUser>
{

    public AppUserManager(IUserStore<AppUser> store)
        : base(store)
    {

    }

    public static AppUserManager Create<AppContainer>() where AppContainer : Container, new()
    {
        var container = new AppContainer();
        var store = container.GetInstance<IUserStore<AppUser>>();

        var manager = new AppUserManager(store);

        manager.UserValidator = new UserValidator<AppUser>(manager)
        {
            AllowOnlyAlphanumericUserNames = false
        };


        return manager;
    }
}

Если в общей библиотеке установлена ​​EntityFramework NuGet, появится предупреждение ниже. Мы не можем рисковать этим.

Пакет EntityFramework 6.2.0 восстановлен с использованием '.NETFramework, Version = v4.6.1' вместо целевой структуры проекта ».NETStandard, Version = v2.0. Этот пакет может быть не полностью совместимым с вашим проектом.

Я читал о том, почему они помещают IdentityUser в библиотеку EF, IdentityUser очень специфично для EF. Однако это затрудняет перенос на .NET Standard 2.0..

Почему класс IdentityUser находится в пространстве имен Microsoft.AspNet.Identity.EntityFramework, а не в пакете Core?

Я также прочитал, что ASP.NET Core 2.0 удалил основание IdentityUser POCO (Простой старый объект CLR).

Microsoft.AspNetCore.Identity и Microsoft.AspNetCore.Identity.EntityFrameworkCore зависят только от .NETStandard 2.0 и могут быть установлены без предупреждения. Нужно ли обновлять Entity Framework и Identity на ASP.NET до Core или есть другой способ заставить его работать с .NET Standard? Последний шаг, который нам нужен, чтобы запустить его.

https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x?view=aspnetcore-2.1

https://docs.microsoft.com/en-us/ef/efcore-and-ef6/side-by-side

1 Ответ

0 голосов
/ 20 февраля 2019

Учитывая, что нам нужно только EntityFramework 6.2.0 для работы с .NET Framework и .NET Core, это будет решено в .NET Core 3.

.NET Core 3 - это крупное обновление, в которое добавлена ​​поддержка сборки Windows настольные приложения, использующие Windows Presentation Foundation (WPF), Windows Forms и Entity Framework 6 (EF6).

https://blogs.msdn.microsoft.com/dotnet/2018/12/04/announcing-net-core-3-preview-1-and-open-sourcing-windows-desktop-frameworks/

...