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