asp.net-mvc - 将Using Blocks放入存储库中有什么问题?

标签 asp.net-mvc linq repository-pattern datacontext

我在存储库的每个方法中都有使用 block 。如果我想交叉引用方法,似乎初始化另一个 Datacontext 是违反最佳实践的,我做错了什么?如果我在类中声明 Datacontext 而不是在方法中使用 block ,我不会失去处理能力吗??

public IList<something> GetSomething()
{ 
   using (DB db=new DB())

   { ...GetListofSomethingElse(id)

   } 
}

public IList<somethingelse> GetListofSomethingElse(int id)
{ 
    using (DB db=new DB())
   {
     ... return IList 

   } 
}

最佳答案

实际上,我认为在语义上(或者我该怎么说)在存储库中创建和处置数据上下文是不正确的。

我的意思是:如果您在存储库的每个方法中打开与数据库的新连接,恕我直言,您就做错了。这太细粒度了。 存储库类不知道它所使用的“上下文”。您的存储库不应负责打开/关闭连接或启动和提交事务。 上下文为王,存储库不知道它所使用的上下文。因此,恕我直言,打开新的 DataContext 对象并关闭/处置它们是应用程序层或服务层的责任。 (这同样适用于交易)。

所以,我是这样做的:(注意,我不使用 Entity Framework ,但我使用 NHibernate。我假设 EF 中的 DataContext 类类似于 NHibernate 中的 ISession):

using( ISession s = theSessionFactory.OpenSession() )
{
    ICustomerRepository cr = RepositoryFactory.GetCustomerRepository(s);

    Customer c1 = cr.GetCustomer(1);
    Customer c2 = cr.GetCustomer(2);

    // do some other stuff
    s.StartTransaction();

    cr.Save (c1);
    cr.Save (c2);

    s.Commit();

}

(这当然不是现实世界的代码;而且它甚至无法编译,因为 ISession 没有 Commit 方法。;)相反,StartTransaction 返回一个具有某种 commit 方法的 ITransaction,但是我想你会明白我的意思的。 ;) )

关于asp.net-mvc - 将Using Blocks放入存储库中有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/449002/

相关文章:

asp.net-mvc - ASP.NET MVC Razor 内容占位符

asp.net-mvc - MVC:如何将文件上传和其他表单字段发布到一个操作

c# - 确定 List<T> 中的值跳跃

c# - 我可以 Linq 查询多个变量吗?

java - DAO/存储库 : Good practice return value after insert/update

c# - ASP.NET MVC - 合并多个小应用程序

jquery 使用 asp.net MVC 部分 View 加载

c# - 扩展列表类上的 linq 操作

repository-pattern - 如何使用 Dapper 实现工作单元模式?

c# - 从服务层返回包含多个实体的 DTO 对象