0

I just switched from ActiveRecord/NHibernate to Dapper. Previously, I had all of my queries in my controllers. However, some properties which were convenient to implement on my models (such as summaries/sums/totals/averages), I could calculate by iterating over instance variables (collections) in my model.

To be specific, my Project has a notion of AppSessions, and I can calculate the total number of sessions, plus the average session length, by iterating over someProject.AppSessions.

Now that I'm in Dapper, this seems confused: my controller methods now make queries to the database via Dapper (which seems okay), but my model class also makes queries to the database via Dapper (which seems strange).

TLDR: Should the DB access go in my model, or controller, or both? It seems that both is not correct, and I would like to limit it to one "layer" so that changing DB access style later doesn't impact too much.

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 不受任何数据库依赖,并使测试更容易;从单元测试中,您可以注入任何实现 IRepository 的模拟。这也允许存储库在没有任何客户端更改的情况下随时实现和切换 Dapper 或实体框架等技术。

上面的示例使用了通用存储库,但您不必这样做;您可以为每个存储库创建一个单独的接口,例如 IFooRepository。

存储库模式的实现方式有很多示例和多种变体,因此请谷歌更多了解它。这是我最喜欢的文章之一。分层架构

另一个注意事项:对于小型项目,直接将查询放入控制器中应该可以...

于 2012-09-18T22:04:50.390 回答
0

我同意@void-ray 关于存储库模型的观点。但是,如果您不想进入接口和依赖注入,您仍然可以分离出数据访问层并使用静态方法从 Dapper 返回数据。

当我使用 Dapper 时,我通常有一个 Repository 库,它返回非常小的对象或列表,然后可以将它们映射到 ViewModel 并传递给 View(映射由 StructureMap 完成,但可以在控制器或其他助手中处理) .

于 2012-09-18T22:34:17.753 回答
0

我个人不能代表 dapper,但我一直限制我的数据库访问模型,除非在非常罕见的情况下。在我看来,这似乎是最有意义的。

更多信息:http ://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

当模型的状态发生变化时,模型会通知其关联的视图和控制器。此通知允许视图生成更新的输出,并允许控制器更改可用的命令集。MVC 的被动实现忽略了这些通知,因为应用程序不需要它们或软件平台不支持它们。

基本上,模型中的数据访问似乎是标准。

于 2012-09-18T20:13:16.603 回答