web-dev-qa-db-ja.com

Ninjectを使用するときにDBContextを処理する方法

NinjectとOpenAccessを初めて使用しようとしています。次のことを手伝ってください。これが私のプロジェクトの様子です...

public class ContentController : Controller
{
    private ContentService contentSvc;

    public ContentController(ContentService contentSvc)
    {
        this.contentSvc = contentSvc;
    }
}

次のクラスは、私のWebアプリのフォルダーの下にあります。

public class ContentService
{
    private IContentRepository contentRepository;

    public ContentService(IContentRepository contentRepository)
    {
        this.contentRepository = contentRepository;
    }

    public void InsertContent(Content content)
    {
         contentRepository.InsertContent(content);
    }
}

次のリポジトリは、別のアセンブリに属しています。

public class ContentRepository : IContentRepository
{
    DBContext db;
    public ContentRepository(DBContext _db)
    {
        db = _db;
    }

    public void InsertContent(Content content)
    {
             db.Add(content);
    }
}   

Ninjectバインディングは次のようになります。

kernel.Bind<ContentService>().To<ContentService>().InRequestScope();
kernel.Bind<IContentRepository>().To<ContentRepository>().InRequestScope().WithConstructorArgument("_db", new DBContext());

一度に1ページをフェッチすると、すべて正常に機能します。シンプルなツール「XENU」を使用して、複数のページを同時にフェッチしています。これは、一度に複数のページをフェッチすることでDBContextでエラーが発生した場合です。

Ninjectが各REQUESTにDBContextを配置しているかどうかわかりませんか?さまざまなエラーが発生します。 'オブジェクト参照がオブジェクトのインスタンスに設定されていません。'、OR 'ExecuteReaderには、開いている使用可能な接続が必要です。接続の現在の状態は開いています。'

P.S.

MVCWebアプリのフォルダーの下にContentServiceがあります。 ContentRepositoryは別のアセンブリです。 ContentServiceにビジネスロジックを追加し、CRUD操作にのみ「ContentRepository」を使用します。また、このアーキテクチャに問題がないか、サービスやリポジトリを作成するためのより良い方法があるかどうかをお知らせください。

23
eadam

これが私があなたのNinjectバインディングを行う方法です、

kernel.Bind<DBContext>().ToSelf().InRequestScope();
kernel.Bind<ContentService>().ToSelf().InRequestScope();
kernel.Bind<IContentRepository>().To<ContentRepository>().InRequestScope();

このパターンは、EFとNinjectを使用した上記の例では正常に機能するはずです。

29
Not loved