3

ApiController(MVC4)に独自のAppContextが必要です。

次のようなものにする必要があります

public class TestController : BaseApiController
{
    [HttpGet]
    public IEnumerable<TestVM> GetAll()
    {
        // the test service is injected with SimpleInjector
        return _testService.GetAll(**base.AppContext**);
    }
}

しかし、ApiControllerはセッションにアクセスしていません。特定のキーに対してセッションを「アクティブ化」するための解決策はありますか(セッション全体が必要ないため)?または、他のアイデア(キャッシュまたはCookie)はありますか?

これはBaseApiControllerです

public abstract class BaseApiController: ApiController
{
    public IAppContext AppContext
    {
        get { return SessionState.AppContext; }
    }
}

これは私のIAppContextです(将来的にはより多くのプロパティがあります)

public interface IAppContext
{
    IIdentity User { get; }

    /// <summary> Gets the user id. </summary>
    /// <value>The user id.</value>
    int IdUser { get; }
}

ここでは、web.configに登録されているアプリケーションモジュール

public class ApplicationModule : IHttpModule
{
    // ...
    SessionState.AppContext = _appContext.InitializeNew(
        HttpRuntime.AppDomainAppPath, languages);
    // ...
}

AppContextを取得するSessionStateクラス

public class SessionState : BaseSessionVariables
{
    public static IAppContext AppContext
    {
        get { return SessionState.Get<IAppContext>("AppContext"); }
        set { SessionState.Set("AppContext", value); }
    }
}

ここでBaseSessionVariablesクラス

public static HttpSessionState GetSession()
{
    return HttpContext.Current.Session;
}

protected static T Get<T>(string key) where T : class
{
    var session = BaseSessionVariables.GetSession();

    if (session == null)
    {
        throw new Exception("No session");
    }
    return (session[key] as T);
}

ご協力いただきありがとうございます!

4

2 に答える 2

0

以下の実装を見てください。正しい方向に向かうはずです。

更新された IAppContext - 追加されたセッター

public interface IAppContext
{
    IIdentity User { get; set; }

    /// <summary> Gets the user id. </summary>
    /// <value>The user id.</value>
    int IdUser { get; set; }
}

更新されたベース コントローラー - OnActionExecuting メソッドで新しい AppContextImplementation をインスタンス化します

public abstract class BaseApiController: ApiController
{
    public IAppContext AppContext {get; set;}

    protected override void OnActionExecuting(
        ActionExecutingContext filterContext)
    {
        AppContext = new AppContextImplementation();
    }
}

新しいクラス - IAppContext を実装し、HttpContext セッションをラップします。テストのために、Session に依存しない TestAppContextImplementation を作成できますが、その他のインメモリ ストレージ メカニズムには依存しません。

public class AppContextImplementation : IAppContext
{
    public IIdentity User
    { 
        get { return HttpContext.Current.Session["User"] as IIdentity; }
        set { HttpContext.Current.Session["User"] = value; }
    }

    int IdUser
    { 
        get { return Convert.ToInt32(Session["IdUser"]); }
        set { Session["IdUser"] = value; }
    }
}
于 2013-01-10T14:20:09.740 に答える