在Web应用程序中,用户登录信息通常存储在会话中,但Windows应用程序如何?使用单身人士是正确的事吗?我应该只使用静态属性吗?
让我们说我将登录信息存储在静态属性ApplicationController中。与loggedInUser。用户成功登录后,将设置该属性。在成功登录之前,LoggedInUser返回null。然后,当我从OrderListPresenter类调用OrdersService示例时,我使用LoggedInUser作为参数。
var service = new OrdersService();
var orderCollection = service.GetOrdersByUserID(
ApplicationController.LoggedInUser.ID);
好的,这可行,但它也使单元测试写得更难。我不喜欢在我的单元测试中使用单身人士/静态成员。
也许我可以将ApplicationController注入需要访问登录用户的每个类?还有其他想法吗?
您认为处理此问题的最佳方式是什么?
答案 0 :(得分:2)
我会创建一个CurrentContext对象,其中包含一个CurrentUser字段并将其传递给我的所有演示者。
Avoid singleton,这可能会对单元测试造成问题,或者您决定稍后扩展应用程序。
答案 1 :(得分:1)
注射是一个很好的答案。您可能会发现其他有用的东西放在ApplicationController
中,这样可以轻松进行单元测试。
答案 2 :(得分:1)
根据您希望对用户身份执行的操作,请考虑将其放在System.Threading.Thread.CurrentPrincipal上。如果您的应用程序具有SecurityPermissionFlag.ControlPrincipal权限,则只需设置CurrentPrincipal即可。另请注意,System.Environment.UserName具有登录的Windows用户标识。
当内置类型已经存在并且做了你想要的(或接近什么)时,滚动你自己的类型总是有成本。