17

Unity を使用してカスタム ユーザー クラス インスタンスの有効期間を管理することを検討しています。カスタム ASP.NET セッション マネージャーを使用して LifetimeManager を拡張することを計画しています。私ができるようにしたいのは、現在ログインしているユーザー オブジェクトをカスタム クラスから保存および取得し、Unity に ASP.NET のセッション オブジェクトから User のインスタンスを取得させるか、(Win32 プロジェクトの場合) それを取得させることです。静的に、または現在のスレッドから。

これまでのところ、私の最善の解決策は、起動時に Unity コンテナーの静的インスタンスを作成し、Resolve メソッドを使用して各クラスから User オブジェクトを取得することです。ただし、これにより、他のクラスの Unity コンテナーへの依存関係が作成されるようです。この目標を達成するためのより「Unity」な方法は何ですか? 任意のクラスから現在の User インスタンスを読み取り/置換できるようにしたいと考えています。

4

7 に答える 7

15

単純な古い ASP.Net プロジェクトではなく、ASP.Net MVC で使用すると、Unity で最高の効果が得られます。ASP.Net MVC を使用すると、Unity などのコンテナーを使用して、ユーザー オブジェクト、コントローラー、モデルなどを管理できます。可能であれば、プロジェクトには ASP.net Web フォームではなく MVC を使用してください。

私があなたの質問を正しく理解していれば、Unity を使用してオブジェクトの有効期間をセッションごとに維持することをお勧めします。LifetimeManager を拡張する SessionLifetimeManager を実装する必要があります。コードは非常に単純で、次の行に沿っています。

public class SessionLifetimeManager : LifetimeManager
{
    private string _key = Guid.NewGuid().ToString();

    public override object GetValue()
    {
          return HttpContext.Current.Session[_key];
    }

    public override void SetValue(object value)
    {
          HttpContext.Current.Session[_key] = value;
    }

    public override void RemoveValue()
    {
          HttpContext.Current.Session.Remove(_key);
    }
}

PerWebRequest の有効期間管理についても、同様のものを作成できます。

于 2010-07-29T06:07:38.527 に答える
2

代わりにキャッシュ オブジェクトを使用してみませんか...そうすれば、win と web の両方から使用できます。このような:

    IUnityContainer container= HttpRuntime.Cache.Get("Unity") as IUnityContainer;

    if (container == null)
    {
        container= // init container

        HttpRuntime.Cache.Add("Unity",
            container,
            null,
            Cache.NoAbsoluteExpiration,
            Cache.NoSlidingExpiration,
            CacheItemPriority.NotRemovable,
            null);
    }

    // return container or something

HttpRuntime.Cache は win と web の両方で機能します

于 2009-05-23T15:58:15.323 に答える
0

Unity を通じて公開する 2 つのサービス (ま​​たは両方のアクションを実行する 1 つのサービス) が必要だと思います。

ユーザー オブジェクトを格納する代わりに、ユーザー オブジェクトを取得するメソッド/プロパティを公開するインターフェイスの実装を格納します。ASP.NET の場合、セッションからユーザーを取得します。WinForm ソリューション (または何でも) では、実行中のスレッドから取得できます。

また、ユーザーを設定するために使用する set メソッド/プロパティもあります。

于 2009-04-01T20:11:31.140 に答える
0

「カスタム ASP.NET セッション マネージャー」によって NHibernate セッションまたは Data/ObjectContext について話している場合、ユーザー オブジェクトを取得できるコンストラクターまたはプロパティ セッターに IUserRepository を挿入する必要があるように思えます。IUserRepository の実装は、データベース アクセスからバックエンド キャッシュなどに至るまでさまざまです。コンテナーで .Resolve() を直接使用している場合は、Service Locatorパターンに従っており、Unity が提供できるすべての機能に対して Unity を適切に使用していません。

その後、 Ravi の回答を使用して、リポジトリの有効期間を管理できます。

于 2010-08-02T23:23:35.060 に答える
0

実際には、Unity ではなくレジストリ パターンが必要なようです。

http://martinfowler.com/eaaCatalog/registry.html

于 2009-05-16T04:38:15.470 に答える
0

考えすぎかもしれませんが、IoC と一緒に AoP を使用する必要があると思います。本当に美しいペアリングです。基本的に私がすることは、解決しているクラスのコンストラクターをハイジャックすることです。それ以外の場合は、アスペクトの作成と呼ばれます。次に、コンストラクターへのエントリでユーザーをクラスに挿入できますが、クラスを解決しているものは何であれ、明示的にユーザーを提供する必要がないため、Unity 自体へのペアリングを防ぎます。

PostSharpは優れた AoP フレームワークの IMHO です。

最終的にアプリは AoP フレームワークに依存することになりますが、完全に分離されたアプリケーションは環境によっては非現実的かもしれません。AoP と IoC の組み合わせがどれほど便利であるかに驚くかもしれません。

于 2010-08-02T01:16:27.443 に答える
-5

これが完全に正しくない場合は申し訳ありませんが...

Unity はゲーム開発プラットフォームであるため、3D アプリまたはゲームを構築していて、何かクールなことをしようとしていると仮定します (例: マルチプレイヤーにする/サーバーを使用してユーザーの進行状況を追跡する)。

各ユーザーがログインしない理由は、MembershipProvider クラスと Formsauthentication クラスを使用して、ユーザーの ID/名前にアクセスできるからです。

サーバーでは、すべての情報をユーザーの情報にリンクするだけで、状況/ユーザーの要求に関連するデータ (単純な ajax/通常の http 要求) を簡単に引き戻すことができます。

これは確かではありませんが、ユニティはクライアント側を展開するものであると信じているため、サーバー上でユニティとの統合を行う必要はありません。

必要なものをリクエストして、クライアント側で処理するだけです。

そうすれば、ロジックをデータ ストレージと UI から分離できる従来の n 層設計パターンに固執することができます。

お役に立てれば ...

于 2010-05-17T14:27:07.450 に答える