1

我正在调整我的 Web 应用程序层,以使代码更具可测试性。

目前,UI 与传入接口的服务定位器对话,这会根据该类型返回适当的对象:

ServiceLocator.Get<ISomeService>().ListStuff(arg1, arg2);

在内部,服务通过实例实例化IServiceContext并缓存。

private static Lazy<IDictionary<Type, object>> _services = new Lazy<IDictionary<Type, object>>(GetServices);

public interface IServiceContext
{
    IConfiguration Configuration { get; }

    IUser CurrentUser { get; internal set; }

    ILogProvider Log { get; }

    ICacheProvider Cache { get; }

    IProfilerProvider Profiler { get; }
}

public LogService(IServiceContext serviceContext)
  : base(serviceContext) { }

我对这个概念很满意,而且它似乎足够坚固,我唯一的问题是我想让当前登录的用户可用,ServiceContext但不确定实现它的最佳方式。

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

  1. 在其中保留一个简单的方法ServiceLocator来处理获取用户会话并将其注入到服务中作为对他们的请求。
  2. 将当前用户移出IServiceContext并移入ServiceBase每个服务的基类。
  3. 停止这样做,并使每个需要用户的服务都依赖它。

我感谢任何建议,我理解这个问题不符合该网站的真正精神。我已经进行了 4 天的反复试验才能达到这一点,只需要这个拼图的最后一块。

4

1 回答 1

0

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

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

您可以创建一个实现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(); } }
}
于 2013-01-19T10:46:52.383 回答