我正在调整我的 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
但不确定实现它的最佳方式。
我的想法沿着这些潜在的选择:
- 在其中保留一个简单的方法
ServiceLocator
来处理获取用户会话并将其注入到服务中作为对他们的请求。 - 将当前用户移出
IServiceContext
并移入ServiceBase
每个服务的基类。 - 停止这样做,并使每个需要用户的服务都依赖它。
我感谢任何建议,我理解这个问题不符合该网站的真正精神。我已经进行了 4 天的反复试验才能达到这一点,只需要这个拼图的最后一块。