【问题标题】:What's wrong with this ASP.net MVC system design?这个 ASP.net MVC 系统设计有什么问题?
【发布时间】:2011-02-07 20:38:36
【问题描述】:

我有一个 ASP.Net MVC 3 照片库,是这样设计的:

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

我使用 Ninject 将所需的服务和存储库注入 Web 应用程序。

在我使用实际数据库之前,我使用了一个简单的 ArrayList(和 JSON 序列化)作为我的持久逻辑(这将是 JsonImageRepository/JSonTagRepository),它工作得非常好。但是后来,我转到了EF4 CTP5(Code First),出现了很多问题。基本上,我将这些存储库和服务注入为 Singleton(在 Global.asax.cs 中声明),但是当我有多个访问存储库的线程时,它说:

数据连接已关闭。

我在 Ninject 中更改为线程模式或请求模式,但引发了各种异常(关于上下文的多个实例,所以我认为单例应该是唯一的选择)。

设计有什么问题吗?或者我应该如何配置这些组件?

【问题讨论】:

    标签: ado.net asp.net-mvc-3 repository-pattern ninject ef4-code-only


    【解决方案1】:

    通常,存储库访问权限应在请求范围内(至少在更改数据的范围内)。我建议查看 bob 的关于使用 Ninject 和 NHibernate 实现存储库模式的博客文章。 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/

    我计划在不久的将来将此添加到示例应用程序中。

    【讨论】:

    • 也就是说每次有新请求都要创建Repository,依赖IRepos的Service层也应该在请求范围内吧?
    • 没错。您还需要在请求开始时打开事务,并在请求结束时提交或回滚事务。
    • 还有一个后续问题。在这种情况下,实体对象的寿命不能超过一个请求周期,这意味着,如果由于某种原因我需要在 Session 中缓存实体对象,除了复制它之外是不可能的,对吧?
    猜你喜欢
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多