用户作为 ASP Net Core 中的范围服务 - 一种不好的做法?
User as scoped service in ASP Net Core - a bad practice?
在我的 ASP Net Core 应用程序中,我需要经常访问和编辑存储在数据库中的与用户相关的数据。通常我的做法如下:
- 将
Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider
注入可以操作数据的作用域服务中(让我们调用该服务 UserEditService
)
- 从提供的
AuthenticationState
和 AuthenticationState.User.Identity.Name
中获取当前用户的用户名
- 注入
Microsoft.AspNetCore.Identity.UserManager<AppUser>
并使用它按名称从数据库加载用户。
- 在
UserEditService
中保存 AppUser
实例的引用
- 操作并保存所述实例
问题是我在我的一些服务中几乎复制并粘贴了相同的代码,我想知道将 AppUser
对象作为作用域服务加载是不是一个更好的主意该应用程序,然后将其注入所有需要用户访问权限的服务中。我还没有找到人们这样做的项目,这让我觉得这可能是一种不好的做法。
是这样吗?如果是,为什么?在 ASPNetCore 中是否有更好的方法来管理与用户相关的数据?
由于 AppUser
由运行时数据组成,尽管当然可以将其注入到其使用者的构造函数中,但在对象构造期间注入运行时数据是一些令人不安的缺点。它
causes ambiguity, complicates the Composition Root with an extra responsibility, and makes it extraordinarily hard to verify the correctness of your DI configuration. Instead, let runtime data flow through the method calls of constructed object graphs.
相反,更喜欢注入允许在运行时检索 AppUser
的抽象,例如使用如下抽象:
interface IAppUserProvider
{
AppUser Current { get; }
}
有关缺点的更详细讨论,请查看我的 this article。 (引自那篇文章)
就是说,虽然这种方法有缺点,但这本身并不意味着它是一种不好的做法或反模式。这是因为有多种方法可以查看运行时数据的使用情况。可以使用两种相互竞争的组合模型;一种是首选将运行时数据捕获到组件中,另一种是首选将运行时数据 存储在 对象图之外。您可以阅读有关这些竞争模型的更多信息 here。
在我的 ASP Net Core 应用程序中,我需要经常访问和编辑存储在数据库中的与用户相关的数据。通常我的做法如下:
- 将
Microsoft.AspNetCore.Components.Authorization.AuthenticationStateProvider
注入可以操作数据的作用域服务中(让我们调用该服务UserEditService
) - 从提供的
AuthenticationState
和AuthenticationState.User.Identity.Name
中获取当前用户的用户名
- 注入
Microsoft.AspNetCore.Identity.UserManager<AppUser>
并使用它按名称从数据库加载用户。 - 在
UserEditService
中保存 - 操作并保存所述实例
AppUser
实例的引用
问题是我在我的一些服务中几乎复制并粘贴了相同的代码,我想知道将 AppUser
对象作为作用域服务加载是不是一个更好的主意该应用程序,然后将其注入所有需要用户访问权限的服务中。我还没有找到人们这样做的项目,这让我觉得这可能是一种不好的做法。
是这样吗?如果是,为什么?在 ASPNetCore 中是否有更好的方法来管理与用户相关的数据?
由于 AppUser
由运行时数据组成,尽管当然可以将其注入到其使用者的构造函数中,但在对象构造期间注入运行时数据是一些令人不安的缺点。它
causes ambiguity, complicates the Composition Root with an extra responsibility, and makes it extraordinarily hard to verify the correctness of your DI configuration. Instead, let runtime data flow through the method calls of constructed object graphs.
相反,更喜欢注入允许在运行时检索 AppUser
的抽象,例如使用如下抽象:
interface IAppUserProvider
{
AppUser Current { get; }
}
有关缺点的更详细讨论,请查看我的 this article。 (引自那篇文章)
就是说,虽然这种方法有缺点,但这本身并不意味着它是一种不好的做法或反模式。这是因为有多种方法可以查看运行时数据的使用情况。可以使用两种相互竞争的组合模型;一种是首选将运行时数据捕获到组件中,另一种是首选将运行时数据 存储在 对象图之外。您可以阅读有关这些竞争模型的更多信息 here。