【问题标题】:Microsoft.AspNet.Identity and Microsoft.AspNet.Identity.EntityFramework in .NET Standard 2.0.NET Standard 2.0 中的 Microsoft.AspNet.Identity 和 Microsoft.AspNet.Identity.EntityFramework
【发布时间】:2018-11-09 11:37:11
【问题描述】:

背景:我们正在开发的项目由几个共享两个库的解决方案组成。今天一切都写在.NET Framework 4.6.1。该项目的目标是为新项目采用.NET Core,并能够在Docker 中运行Web 应用程序。

随着.NET Standard 2.1 的新版本以及.NET Framework 4.8 将保留在.NET Standard 2.0 而不是实施.NET Standard 2.1 的事实,感觉是时候开始了。来自微软的 Immo Landwerth 说:

但同样正确的是 .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。报告它,以便微软可以查看它。

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

我们在项目之间共享UserManagerContainer 来自与.NET Standard 2.0 兼容的SimpleInjector

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' 代替项目目标框架 '.NET 标准,版本 = v2.0'。此软件包可能不完全兼容 与您的项目。

我已经了解了他们为什么将 IdentityUser 放入 EF 库中,IdentityUser 是非常特定于 EF 的。然而,这使得移植到.NET Standard 2.0. 变得更加困难。

Why is the IdentityUser class in the Microsoft.AspNet.Identity.EntityFramework namespace and not in the Core package?

我还读到 ASP.NET Core 2.0 已经删除了基础 IdentityUser POCO(普通旧 CLR 对象)。

Microsoft.AspNetCore.IdentityMicrosoft.AspNetCore.Identity.EntityFrameworkCore 只对.NETStandard 2.0 有依赖关系,可以在没有警告的情况下安装。我们是否需要将 ASP.NET 上的 Entity Framework 和 Identity 升级到 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

【问题讨论】:

  • 这个EntityFramework 6.2.0' was restored using '.NETFramework,Version=v4.6.1不会在linux下启动,所以如果你需要在linux下运行你的网站,你需要从EF切换到EF core
  • @tym32167 是的,这就是为什么我们不能冒险拥有它的原因:)
  • 那么,那有什么问题呢? :)
  • @tym32167 我们是否需要将 Entity Framework 和 Identity 升级到 Core,或者是否有其他方法可以使其与 .NET Standard 一起使用? :)
  • .NET Standard 2.0 is supported on the following platforms,所以如果您使用的是 FW 4.6.1 - 您可以使用 .NET Standard 2.0 库

标签: c# asp.net .net .net-standard .net-standard-2.0


【解决方案1】:

鉴于我们只需要EntityFramework 6.2.0 来处理.NET Framework.NET Core 这将在.NET Core 3 中解决。

.NET Core 3 是一个重大更新,增加了对构建 Windows 的支持 使用 Windows Presentation Foundation (WPF) 的桌面应用程序, Windows 窗体和实体框架 6 (EF6)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2022-06-22
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多