18

現在、HttpContext から現在のユーザー名を取得し、それをサービス メソッドで使用するアクションに渡す ActionFilter があります。例えば:

Service.DoSomething(userName);

アクション レベルではなく、コントローラー コンストラクター レベルでこれを行う理由ができました。現在、構造マップを使用してコントローラーを作成し、サービスを注入しています。私は次のようなものを見ています:

public interface IUserProvider
{
    string UserName { get; }
}

public class HttpContextUserProvider : IUserProvider
{
    private HttpContext context;

    public HttpContextUserProvider(HttpContext context)
    {
        this.context = context;
    }

    public string UserName
    {
        get
        {
            return context.User.Identity.Name;
        }
    }
}

とはいえ、これは私が使用した最初のプロジェクトであるため、私の IoC foo は非常に弱いです。

だから私の質問は...構造マップにHttpContextUserProviderのコンストラクターでHttpContextを渡すように指示するにはどうすればよいですか? これは奇妙に思えます... HttpContextの考え方がわかりません。

4

4 に答える 4

10

HttpContextBaseの代わりに使用する必要があるようですHttpContextUserProvider。これはすぐに使える抽象化でHttpContextあり、モックを作成し、UnitTests を記述し、依存関係を注入することができます。

public class SomethingWithDependenciesOnContext
{
    public SomethingWithDependenciesOnContext(HttpContextBase context) {
        ...
    }

    public string UserName
    {
        get {return context.User.Identity.Name;}
    }
}

ObjectFactory.Initialize(x => 
          x.For<HttpContextBase>()
          .HybridHttpOrThreadLocalScoped()
          .Use(() => new HttpContextWrapper(HttpContext.Current));
于 2013-02-08T14:10:23.300 に答える
8

インターフェース抽象を持っていますHttpContext.Current。必要なメソッドのみを公開します。たとえば、実装GetUserName()を呼び出します。HttpContext.Current.User.Identity.Nameそれをできるだけ薄くします。

その抽象化を取り、他のプロバイダー クラスに挿入します。これにより、http コンテキストの抽象化をモックしてプロバイダーをテストできます。副次的な利点として、HttpContextモックを作成する以外に、その抽象化を使用して他の気の利いたことを行うことができます。一つには、それを再利用します。バッグなどにジェネリック型パラメーターを追加します。

于 2009-05-18T16:34:08.540 に答える
2
于 2009-05-18T14:44:04.017 に答える