【问题标题】:is it correct architecture of ASP.NET MVC & EF app?它是 ASP.NET MVC 和 EF 应用程序的正确架构吗?
【发布时间】:2011-10-09 22:11:01
【问题描述】:

我有以下存储库类:

public class Model1Repository
{
    private NEOGOV_IdeasEntities _dataContext;
    public Model1Repository()
    {
        _dataContext = new NEOGOV_IdeasEntities();
    }
    public IdeaType IdeaType(int ID)
    {
        var q = from i in _dataContext.IdeaTypes where i.ID == ID select i;
        return q.FirstOrDefault();
    }
    ... rest methods....
}

跟随控制器:

public class TestController : Controller
{
    private Model1Repository _repository;

    public TestController()
    {
        _repository = new Model1Repository();
    }
    public ActionResult Tagedit()
    {
        return View(_repository.GetDataFromDB1());
    }

    public ActionResult Avatar()
    {
        return View(_repository.GetDataFromDB2());
    }
}

它是正确的架构吗?或不?据我了解,在我的情况下,_repository 变量会为每个请求创建...

【问题讨论】:

  • 有效吗?是的。好吗?不,你应该使用依赖注入 :) 使用 Ninject 查看依赖注入。设置非常简单。

标签: asp.net-mvc entity-framework architecture


【解决方案1】:

就个人而言,我会在控制器操作中实例化存储库,而不是在构造函数中。如果您确定所有控制器操作都需要存储库,那么这很公平,但是由于控制器上的操作与 UI 的操作相关,因此拥有不需要它的控制器方法一点也不稀奇。

但归根结底,这确实是一种风格(好吧,也许有一些小的性能开销);如果您想这样做,请随意!

【讨论】:

  • 你在下面写了关于 _repository 作为单例。有道理吗?
  • 在您的实现中,_repository 不是单例,这很好。为了利用连接池,您需要快速释放数据上下文。您的 _repository 将在控制器操作之后被垃圾收集这一事实将有助于实现这一点,而使用单例模式则不会。但是在需要时创建存储库并尽快发布它可以进一步提高效率并提高可扩展性。
【解决方案2】:

无法回答整个架构,但将为 TestController 实例化一个且只有一个存储库 Model1Repository 对象,而不是每个请求(HTTP 请求)一个。

【讨论】:

  • 为什么?调试器说,控制器的构造函数调用每个请求。 ctor 创建 Model1Repository 的新副本,Model1Repository 的 ctor 创建 NEOGOV_IdeasEntities 的新副本。因此,每个请求都会创建 NEOGOV_IdeasEntities 的新副本....
  • 控制器的默认生命周期是每次请求,并且由于 _repository 不是单例,因此每次都会创建一个新的。
猜你喜欢
  • 2017-04-01
  • 1970-01-01
  • 2010-11-29
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多