25

初めて 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を処理しているかどうかわかりません?? 「オブジェクト参照がオブジェクトのインスタンスに設定されていません。」、または「ExecuteReader にはオープンで使用可能な接続が必要です。」など、さまざまなエラーが発生します。接続の現在の状態は開いています。

PS

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

4

1 に答える 1

30

Ninjectバインディングを行う方法は次のとおりです。

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

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

于 2012-08-12T11:56:20.513 に答える