如何在域模型中使用 AspNet.Identity

How to use AspNet.Identity in a Domain Model

域模型应该对应用程序的问题域建模,但完全不知道其实现的某些方面;例如数据访问。

在这方面,将 Microsoft.AspNet.Identity.EntityFramework 添加到域模型感觉有点脏,因为域模型应该不知道(也不关心)我将使用 [=44= 来实现它]...

...这就是我的问题

在我的域模型中,我有几个 类 链接到用户帐户

例子

class Profile
{
    public User Owner { get; set; }
}

class BlogPost
{
    public User Owner { get; set; }
}

问题是 User 扩展了 IdentityUser,因此引用了 EntityFramework

我能想到的唯一解决方案是将对 User 的引用替换为 Guid,只需链接所有者 ID

例子

class Profile
{
    public Guid OwnerId { get; set; }
}

再一次,这感觉很脏,反对 OOP,而且不是很 SOLID

鉴于我想要尽可能优雅的解决方案,我该如何解决这个问题?

我同意你的观点,身份框架模型应该与其他模型分开。而且我认为您自己会在问题中给出答案。 如果不实施身份框架,模型是否完整?用户不是域模型的一部分,而是身份模型的一部分。但是,您正在链接到此 table.

我认为最好的解决方案是创建域用户 table 并将您的模型与该 table 相关联。您可以使用身份框架用户 GUID 作为密钥。这将在两个 table 之间创建一个 1:1 关系。

使用域用户 table 扩展用户 class(来自身份框架)以轻松访问域用户 table,以防您需要添加或删除用户。尽管 domain.user 不是身份框架的一部分,但您可以访问此 table 而无需将此 table 添加到身份框架模型本身。只需在用户 (IdentityUser) class.

中添加引用

如果您不想创建新用户 table,那么您可以添加一个域用户 class(不扩展 IdentityUser),它只公开您创建的(非关键)字段想阅读或更新。