0

私はこのように設計されてASP.Net MVC 3フォトギャラリー、持っている:私は、Webアプリケーションに必要なサービスとリポジトリを注入するNinjectを使用このASP.net MVCシステム設計で何が問題になっていますか?

Data Repositories(IImageRepoSitory, ITagRepository etc) 
     | 
    Services (IGalleryService, IWebService etc) 
     | 
    Web Application 

を。

私は実際のデータベースを使用する前に、完璧にうまく動作する既存のロジック(これはJsonImageRepository/JSonTagRepositoryになります)として単純なArrayList(およびJSONシリアル化)を使用しました。しかし後で、私はEF4 CTP5(Code First)に移り、多くの問題が現れました。基本的に、私は(Global.asax.csで宣言さ)シングルトンとしてこれらのリポジトリやサービスを注射し、私はリポジトリにアクセス複数のスレッドを持っている場合、それはsaids:

データ接続が閉じられています。

Ninjectではいくつかの例外が発生しましたが、さまざまな例外が発生しました(コンテキストの複数のインスタンスに関しては、Singletonは唯一のオプションであるべきだと思います)。

デザインに問題はありますか?どのようにこれらのコンポーネントを設定する必要がありますか?

答えて

4

通常、リポジトリアクセスは要求スコープ(少なくともデータを変更するもの)である必要があります。私は、NinjectとNHibernateを使ってリポジトリパターン実装についてのbobのブログ記事を見ることをお勧めします。それはEF4のためにほとんど同じでなければなりません:

http://blog.bobcravens.com/2010/06/the-repository-pattern-with-linq-to-fluent-nhibernate-and-mysql/

http://blog.bobcravens.com/2010/07/using-nhibernate-in-asp-net-mvc/

http://blog.bobcravens.com/2010/09/the-repository-pattern-part-2/

私は近い将来、サンプルアプリケーションにこれを追加する計画しました。

+0

これは、新しいリクエストが作成されるたびにリポジトリを作成する必要があり、IReposに依存するサービス層もリクエストスコープでなければならないということですか? – xandy

+0

そうです。要求が開始されたときにトランザクションを開き、要求が終了したときにトランザクションをコミットまたはロールバックしたい場合もあります。 –

+0

もう1つのフォローアップの質問。そのような場合、エンティティオブジェクトは1つのリクエストサイクルよりも長く存続することはできません。何らかの理由でセッション内にEntityオブジェクトをキャッシュする必要がある場合は、それを複製する以外にはできません。 – xandy

関連する問題