コードをよりテストしやすくするために、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 日間の試行錯誤を重ねましたが、このパズルの最後のピースが必要なだけです。