1

まず、これが怠惰に見えないことを願っていますが、次のプロジェクトのコードを理解するのに問題があります。

http://kigg.codeplex.com/

ソースコードを調べていたところ、自分が作成している小さなプロジェクトに役立つものに気づきました。BaseControllerには、次のコードがあります。

private static readonly Type CurrentUserKey = typeof(IUser);

public IUser CurrentUser
{
    get
    {
        if (!string.IsNullOrEmpty(CurrentUserName))
        {
            IUser user = HttpContext.Items[CurrentUserKey] as IUser;

            if (user == null)
            {
                user = AccountRepository.FindByClaim(CurrentUserName);

                if (user != null) 
                {
                    HttpContext.Items[CurrentUserKey] = user; 
                }
            }

            return user;
        }

        return null;
    }
}

これは、必要に応じて少し調整したコードの正確なコピーではありません。私がまだ理解しているコードのこの部分。IUserをHttpContext.Itemsに格納します。Userオブジェクトが必要になるたびにデータベースを呼び出す必要がないようにするためだと思います。

私が理解していない部分は、リクエストの合間にこのオブジェクトをどのように維持するかです。私が正しく理解していれば、HttpContext.Itemsはリクエストごとのキャッシュストレージです。

それで、もう少し掘り下げた後、私は次のコードを見つけました。

internal static IDictionary<UnityPerWebRequestLifetimeManager, object> GetInstances(HttpContextBase httpContext)
{
    IDictionary<UnityPerWebRequestLifetimeManager, object> instances;

    if (httpContext.Items.Contains(Key))
    {
        instances = (IDictionary<UnityPerWebRequestLifetimeManager, object>) httpContext.Items[Key];
    }
    else
    {
        lock (httpContext.Items)
        {
            if (httpContext.Items.Contains(Key))
            {
                instances = (IDictionary<UnityPerWebRequestLifetimeManager, object>) httpContext.Items[Key];
            }
            else
            {
                instances = new Dictionary<UnityPerWebRequestLifetimeManager, object>();
                httpContext.Items.Add(Key, instances);
            }
        }
    }

    return instances;
}

これは私が理解できない魔法が起こる部分です。彼らはUnityを使用して各リクエストに依存性注入を行っていると思いますか?私のプロジェクトではNinjectを使用していますが、どうすれば同じ結果が得られるのでしょうか。

NinjectのInRequestScopeはUnityPerWebRequestLifetimeManagerと同じだと思いますか?また、どのクラス/メソッドがどのインターフェイスにバインドされているのか疑問に思っていますか?HttpContext.Itemsはリクエストごとに破棄されるため、ユーザーオブジェクトの損失を防ぐにはどうすればよいですか?

とにかく長い質問なので、正しい方向に進んでくれたことに感謝しています。

4

1 に答える 1

0

Ninjectでは、技術固有の拡張機能(Ninject.WebまたはNinject.Web.Mvc)を選択し、InRequestScopeを使用して「.Itemsコンテキスト」内のものを管理します。それらはリクエストの最後に破棄され、新しいリクエストはその後のリクエストで必要に応じて解決されます。

それは間違いなくあなたが引用しているもののいくつかほど多くのコードや複雑になることはありませんIMO:D

于 2010-05-14T14:30:38.103 に答える