gpt4 book ai didi

c# - 从另一个项目继承 (?) IdentityUser

转载 作者:行者123 更新时间:2023-12-03 14:14:33 25 4
gpt4 key购买 nike

我的解决方案中有多个项目,都是 .NET Core 3.1。其中之一是我的核心项目(“ A Project ”),其中我只有基本的模型类,没有方法或数据库访问权限。出于演示目的,以下是我的 Address.cs 的简化版本和 User.cs文件:

public class Address 
{
public int Id {get;set;}
public string AddressText {get;set;}
public virtual User User {get;set;}
}

public class User
{
public int UserId {get;set;}
public int UserName {get;set;}

public ICollection<Address> {get;set;}
}

在另一个项目(“ B 项目 ”)中,我将构建实际功能。这个项目已经设置了 ASP.NET Core Identity 和 ApplicationUser类,派生自 IdentityUser并添加一些自定义属性。

这就是我遇到问题的地方。 Address.User属性必须设置为 ApplicationUser 的实例, 但是 ApplicationUser住在 B项目 .

显然,我没有将 ASP.NET Core 标识设置为我的 中的依赖项。一个项目 ,所以我无法移动 ApplicationUser进入那个项目。此外,我无法分配 ApplicationUserAddress.User属性自 ApplicationUser并非源自 User .

做了一些研究,我发现了一些不同的建议。一个建议是为 ASP.NET Core Identity 组件使用一个单独的项目,然后在我的 旁边引用它。一个项目来自我的 B项目 .另一个灵魂建议创建我自己的 UserStore .

我不想要我的 一个项目依赖任何东西。但是我没有足够的经验来决定哪种选择更适合我的方案。

最佳答案

我以前肯定把自己画到这个特定的角落!
您可以采取一些策略来解决此问题,包括您列出的两个。然而,我推荐的方法是使用 interfaces .
概括
而不是一个具体的User类,你将有一个 IUser您将从 中的模型中引用的接口(interface)项目A .然后,您将应用 IUser与您的ApplicationUser 的接口(interface)类(class)。这将允许 ApplicationUser 的实例分配给您的例如Address.User属性(property),尽管 Address不知道 ApplicationUser .
例子
项目A ,您将更新您的类,如下所示:

public class Address 
{
public int Id {get;set;}
public string AddressText {get;set;}
public virtual IUser User {get;set;}
}

public interface IUser
{
int UserId {get;set;}
int UserName {get;set;}
ICollection<Address> {get;set;}
}
然后,在 B项目 ,您将申请 IUser与您的 ApplicationUser 的接口(interface)类并确保它实现所需的属性:
public class ApplicationUser: IdentityUser, IUser 
{

public int UserId {get;set;}
public ICollection<Address> {get;set;}
}

Note: You don’t need to implement UserName, as that’s already been implemented on IdentityUser. Though, of course, you can always override the property, should the need arise (e.g., to add validation attributes).


限制
例如,当您访问 Address.User属性,您将只能访问您在 IUser 上定义的成员.如果您需要访问在 ApplicationUser 上定义的任何其他成员或 IdentityUser ,您首先需要转换您的 IUser引用 ApplicationUser ;例如。,
var user = address.User as ApplicationUser;
var emailConfirmed = user?.EmailConfirmed?? false;
当然,如果您知道您将需要访问这些成员,您只需确保它们已在您的界面上定义,而不必担心这一点。
注意事项
有几点需要注意。这些可能不适用于您,但为了完整起见,我想将它们包括在内。
欧/RM
正如我在评论中提到的,如果您使用 O/RM 来填充您的模型(例如 Entity Framework (EF) Core),您可能会遇到在单独的程序集中识别接口(interface)的具体实现的问题。这是可以做到的,但它肯定会增加您可能不想应对的复杂性!但是,如果您手动构建对象图,这将不是问题。
身份与用户模型 IdentityUser旨在代表当前经过身份验证的用户,而不是一般用户引用。例如,在电子商务应用程序中,构造 IdentityUser 是没有意义的。引用每个产品的卖方。这里显然存在重叠,使用一个数据源同时提供两者都可以。但也有一些属性——例如 PasswordHashSecurityStamp ——在一般用户模型上填充是没有意义的。您最终可能会发现这些需求相互冲突。

在上述任何一种情况下,您可能会发现更容易区分您的 ApplicationUser。和你的 User类。这不是你要求的,但值得考虑。在这种情况下,@RomanKalinchuk 的方法更有意义。尽管如此,您仍然可以通过应用相同的 IUser 来统一它们。每个接口(interface),从而确保它们共享一组核心属性。

关于c# - 从另一个项目继承 (?) IdentityUser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62328729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com