1

ASP.NET Web API と Ninject を使用して REST サービスをまとめていますが、これは私の IoC フレームワークに固有のものよりも一般的な IoC の質問であると思われます。User エンティティの単純なキャッシュにアクセスする必要があるオブジェクトがいくつかあります。

public class UserCache
{
    private IList<User> users;
    private IUserRepositoryFactory factory;

    [Inject]
    public UserCache(IUserRepositoryFactory factory)
    {
        this.factory = factory;
        this.users = new List<User>();
    }

    public void Add(int id)
    {
        IUserRepository repo = factory.Create(new TestContext());

        this.users.Add(repo.Get(id));
    }

    public int Count { get { return this.users.Count; } }
}

実際には、キャッシュはリードスルーであり、UserRepository (および関連する IUserRepository インターフェイス) を使用してユーザー エンティティでいっぱいになります。

public class UserRepository : IUserRepository
{
    private readonly TestContext context;

    public UserRepository(TestContext context)
    {
        this.context = context;
    }

    public User Get(int id)
    {
        return new User() { Name = "Test User" };
    }
}

キャッシュは長期間存続し、アプリケーション全体で共有されます。私の質問は次のとおりです。UserRepository を使用して、データベースから User エンティティをプルしたいと考えています。このリポジトリは、何らかの方法でキャッシュに挿入するか、ファクトリを使用してインスタンス化する必要があります。

秘訣は、a) Ninject がその依存関係を注入するようにキャッシュを作成し、b) 同じようにキャッシュにアクセスできる唯一の方法は、キャッシュをシングルトン スコープでバインドし、それをオブジェクトに注入することです。それにアクセスする必要がある:

kernel.Bind<TestContext>().ToSelf();
kernel.Bind<UserCache>().ToSelf().InSingletonScope();

...そしてコントローラで(たとえば):

[Inject]
public UserCache Cache { get; set; }

私の質問は、これが注入を必要とする長寿命のオブジェクトを処理するための最良の方法ですか? または、私が見逃しているより良い方法はありますか?キャッシュ (またはそのような他のオブジェクト) に Ninject カーネルへの直接アクセスを許可したくありません。

4

1 に答える 1

5

これは逆ではないでしょうか。コントローラーで IUserRepository を使用する必要があり、フードの下のリポジトリは、データが既にキャッシュされている場合はキャッシュからデータをフェッチする必要があります (インターセプターを使用した方がよい)。そうでない場合は、データベースにアクセスする必要があります。

そうすれば、長期間キャッシュされたオブジェクトのライフサイクルについて心配する必要がなくなります。結局のところ、WebAPI (これまでのところ) 全体が Web スタック上で実行されることに注意してください。これは、アプリケーションがさまざまな要因に基づいて予期せずリサイクルされる可能性があることを意味します。

于 2012-08-27T00:41:28.187 に答える