在WebApi中,我可以通过获得使用AspIdentity的当前用户
User.Identity.GetUserId<long>();
然而,服务层并不知道AspIdentity。我不想将当前用户作为所有方法的参数。
换句话说,我可以使用什么模式来获取我想要的任何位置的当前用户。
这样做的原因是记录当前用户在应用程序中进行的所有活动。
API是无状态的,您可以使用当前登录的用户,但您可能有第三方应用程序访问您的API。因为它是无状态的,所以当前用户的处理方式与标准web调用不同。
长话短说:无论您如何验证API用户,都需要将用户名/userID传递到服务层。好消息是,一旦设置好了,就可以对API和非API调用使用相同的服务层方法。
最后这就是我实现它的方式
在框架层(一个独立于社区的项目)中,我添加了以下内容:
public interface ICurrentContextProvider<T>
{
T GetCurrentUser();
}
在API中,我添加了这个接口的实现,类似于:
public ApplicationUser GetCurrentUser()
{
return _usersService.FindByIdAsync(Convert.ToInt64(HttpContext.Current.User.Identity.GetUserId())).Result;
}
正如所有其他层都知道的框架层一样,我可以在任何地方调用它,而无需引用AspIdentity,也无需将当前用户传递给我的所有函数。
注意:由于以下原因,我将其设为泛型:1-Framework(公共层)不了解应用程序用户2-我可以从上下文中获得任何其他类型,比如ApplicationUserId,它是Long。