0

ActiveRecord/NHibernateからDapperに切り替えました。以前は、すべてのクエリをコントローラーに入れていました。ただし、モデルに実装するのに便利ないくつかのプロパティ(summary / sums / totals / averagesなど)は、モデル内のインスタンス変数(コレクション)を反復処理することで計算できました。

具体的には、myProjectにはの概念がありAppSessions、を繰り返すことで、セッションの総数と平均セッション長を計算できますsomeProject.AppSessions

私がDapperにいるので、これは混乱しているようです。コントローラーメソッドはDapperを介してデータベースにクエリを実行しますが(これは問題ないようです)、モデルクラスもDapperを介してデータベースにクエリを実行します(奇妙に思えます)。

TLDR:DBアクセスは、私のモデル、コントローラー、またはその両方で行う必要がありますか?どちらも正しくないようです。後でDBアクセススタイルを変更してもあまり影響がないように、1つの「レイヤー」に制限したいと思います。

4

3 に答える 3

3

リポジトリパターンの使用を検討する必要があります:

リポジトリを使用すると、すべてのデータベースクエリは、パブリックインターフェイスを介して公開されるリポジトリ内にカプセル化されます。次に例を示します。

public interface IGenericRepository<T> where T : class
{
    T Get(object id);
    IQueryable<T> GetAll();
    void Insert(T entity);
    void Delete(T entity);
    void Save(T entity);
}

次に、リポジトリをコントローラに挿入できます。

public class MyController
{
    private readonly IGenericRepository<Foo> _fooRepository;
    public MyController(IGenericRepository<Foo> fooRepository)
    {
        _fooRepository = fooRepository;
    }   
}

これにより、UIにDBの依存関係がなくなり、テストが容易になります。単体テストから、IRepositoryを実装する任意のモックを注入できます。これにより、リポジトリは、クライアントを変更することなく、いつでもDapperやEntityFrameworkなどのテクノロジを実装および切り替えることができます。

上記の例では汎用リポジトリを使用しましたが、必ずしもそうする必要はありません。IFooRepositoryなど、リポジトリごとに個別のインターフェースを作成できます。

リポジトリパターンの実装方法には多くの例とバリエーションがありますので、もう少しグーグルで理解してください。これが私のお気に入りの記事の1つです。階層化されたアーキテクチャ

別の注意:小さなプロジェクトの場合、クエリをコントローラーに直接入れても問題ありません...

于 2012-09-18T22:04:50.390 に答える
0

私は個人的にdapperについて話すことはできませんが、非常にまれな状況を除いて、常にモデルへのデータベースアクセスを制限してきました。それは私の意見では最も理にかなっているようです。

もう少し情報: http: //en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

モデルの状態が変化すると、モデルは関連するビューとコントローラーに通知します。この通知により、ビューは更新された出力を生成し、コントローラーは使用可能なコマンドのセットを変更できます。MVCのパッシブ実装では、アプリケーションが通知を必要としないか、ソフトウェアプラットフォームが通知をサポートしていないため、これらの通知を省略します。

基本的に、モデルでのデータアクセスが標準のようです。

于 2012-09-18T20:13:16.603 に答える
0

リポジトリモデルに関して@void-rayに同意します。ただし、インターフェイスや依存性注入を使用したくない場合でも、データアクセス層を分離し、静的メソッドを使用してDapperからデータを返すことができます。

Dapperを使用している場合、通常、非常に小さなオブジェクトまたはリストを返すリポジトリライブラリがあり、これらをViewModelにマッピングして、Viewに渡すことができます(マッピングはStructureMapによって行われますが、コントローラーまたは別のヘルパーで処理できます)。 。

于 2012-09-18T22:34:17.753 に答える