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 カーネルへの直接アクセスを許可したくありません。