3

私のリポジトリクラスはそれぞれ次のようになります。

public class ProfileRepository : IProfileRepository{

   private MyEntities myEnt = new MyEntities();
   ...

}

私はリポジトリクラスを次のように注入しています:

private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<IProfileRepository>().To<ProfileRepository>();
            ....
            GlobalHost.DependencyResolver =  new NinjectDependencyResolver(kernel);
            GlobalHost.DependencyResolver.Register(typeof(IConnectionIdGenerator), () => new MyConnectionFactory());
            RouteTable.Routes.MapHubs(new NinjectDependencyResolver(kernel));
        }       

MyEntities コンテキストをすべてのリポジトリ クラスに挿入したいので、各リポジトリ クラスにそのインスタンスがありません。どうすればこれを達成できますか? これはより良い習慣でしょうか?

4

2 に答える 2

3

まず、Ninject.MVC3パッケージを使用する方がよいでしょう。フレームワークに Ninject をアタッチする負担を軽減し、バインディングについてのみ心配する必要があります。

を使用できます kernel.Bind<your-database-context>().ToSelf().InRequestScope()

これにより、同じ MVC リクエストで作成された場合、すべてのリポジトリが同じ DbContext を取得するようになります。

注: Ninject.MVC3 なしで InRequestScope() を使用することはできません。

そうは言っても、リポジトリはまったくひどい抽象化だと思います。単体テストのためだけに、データアクセスを抽象化するために多くのフープを通過する必要があります。データ アクセスを抽象化せず (Microsoft は既に Entity Framework で非常に優れた仕事をしています)、単体テスト用に適切なデータベース コピーを準備するだけのほうがよいでしょう。Django は単体テストで同様のことを行います。これを自動的に処理する単体テスト システムがあるのではないかと思います (単体テストのみのデータベース スナップショットよりも新しい移行の適用を含む)。

于 2012-10-04T21:21:07.310 に答える
3

これは、ジェネリック インターフェイスを作成することで実現しましたIMyEntitiesContext

今、私は現時点でこれを記憶から書いているので、これは 100% 正しいかもしれませんし、そうでないかもしれません:

このようなもの:

public interface IMyEntitiesContext : IDisposable
{
    IDbSet<Profile> Profiles { get; }
    ...
    ...
    int SaveChanges();
}

次に、DbContext クラスを変更して、このインターフェイスを実装します。

public MyEntities : DbContext, IMyEntitiesContext
{
    public IDbSet<Profile> Profiles { get; set; }
    ...
    ...
}

これで、IMyEntitiesContext を使用してコンストラクター/プロパティ インジェクションをセットアップできます。

public ProfileRepository : IProfileRepository
{
    private IMyEntitiesContext _ctx;

    public ProfileRepository(IMyEntitiesContext ctx)
    {
        _ctx = ctx;
    }
}
于 2012-10-04T21:36:43.890 に答える