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. 現在のユーザーを取得して、各サービスIServiceContextServiceBase基本クラスに移動します。
  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 に答える