Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 服务定位器模式和登录用户_C#_Design Patterns_Service Locator - Fatal编程技术网

C# 服务定位器模式和登录用户

C# 服务定位器模式和登录用户,c#,design-patterns,service-locator,C#,Design Patterns,Service Locator,我正在调整我的web应用程序层,以使代码更易于测试 当前UI与传入接口的服务定位器对话,这将基于该类型返回相应的对象: ServiceLocator.Get<ISomeService>().ListStuff(arg1, arg2); 我对这个概念很满意,而且它看起来足够坚固,我唯一的问题是我想让当前登录的用户在ServiceContext中可用,但不确定实现它的最佳方式 我的想法围绕着这些潜在的选择: 在ServiceLocator中保留一个简单的方法,该方法处理获取用户会话并在

我正在调整我的web应用程序层,以使代码更易于测试

当前UI与传入接口的服务定位器对话,这将基于该类型返回相应的对象:

ServiceLocator.Get<ISomeService>().ListStuff(arg1, arg2);
我对这个概念很满意,而且它看起来足够坚固,我唯一的问题是我想让当前登录的用户在
ServiceContext
中可用,但不确定实现它的最佳方式

我的想法围绕着这些潜在的选择:

  • ServiceLocator
    中保留一个简单的方法,该方法处理获取用户会话并在用户请求时将其注入服务
  • 将当前用户从
    IServiceContext
    移动到每个服务的
    ServiceBase
    基类中
  • 停止这样做,让每个需要用户的服务依赖于它
  • 我感谢任何建议,我理解这个问题不是我的网站的真正精神。
    我经过了4天的反复尝试才达到这一点,只需要这道难题的最后一块。

    可能有很多解决方案,我不确定我是否完全理解你的问题,但无论如何我都会尽力帮助你

    每当我需要当前用户时,我就在使用它的代码的上下文中调用静态实用程序类。这样我就消除了陈旧信息的可能性

    您可以创建一个实现
    IUser
    的类,如

    class User : IUser {
      private System.Security.Principal.WindowsIdentity identity;
    
      public User() {
        this.identity = identity = System.Security.Principal.WindowsIdentity.GetCurrent();
      }
    
      public string UserName { get { return this.identity.Name; } }
    }
    
    然后也许:

    public class ServiceContext : IServiceContext
    {
        IUser CurrentUser { get { return new User(); } }
    }
    

    我不喜欢ServiceLocator,但是……我认为2或3比1更好。如果这是一个web上下文,并且我正在使用IoC,我可能会通过构造函数注入
    IUser
    ,基本上采用您的#3选择。这可能是最简单的测试方法,我想你是对的。我已经检查了什么实际需要这个属性,并计算出了如何在那里存在以及它是否真正需要回答这个问题之间的平衡。我想我希望有一个闪光的时刻。这就是我所拥有的,但我刚刚重构了很多代码,以摆脱实用方法,因为它们阻碍了测试。谢谢你的时间和建议。
    public class ServiceContext : IServiceContext
    {
        IUser CurrentUser { get { return new User(); } }
    }