我已在库中的每一个方法,使用块。如果我要交叉引用的方法,现在看来,这将是对最佳实践来初始化另一个DataContext的我在做什么错?如果我声明在类而不是在方法使用块一个DataContext将我不会失去功率处置??

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

   { ...GetListofSomethingElse(id)

   } 
}

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

   } 
}
有帮助吗?

解决方案

如果你不使用using语句,你仍然可以处理作了明确规定。即使你不处理数据的情况下,虽然,交叉引用这些方法仍然会创建一个新的数据上下文。这可能是也可能不是一件好事,这取决于您的使用。想想数据上下文的状态管理方面,以及是否要彼此隔离与否的方法。如果你想避免创建一个新的上下文所有的时间,过载与内搭的上下文作为参数版本的方法。

请注意你通常不会的需要处置数据上下文,虽然我倾向于处置实施IDisposable的任何东西。

其他提示

其实,我认为这是语义上(或者我应该怎么说),不正确的创建和存储库处理一个DataContext。

我的意思是:如果你打开每到一个数据库中的新的连接和存储库的每一个方法,你这样做是错误恕我直言。这实在是太多了细粒度。 该库类没有在正在使用它的“语境”的知识。您的仓库不应该负责打开/关闭连接或启动和提交交易。 上下文为王,而仓库没有在正在使用它的背景知识。因此,恕我直言,这是应用层或服务层,打开新的DataContext对象的责任,并关闭/处置他们。 (这同样适用于交易)。

所以,这是我要做的事:(注意,我不使用实体框架,但我用NHibernate的我认为在EF DataContext类是类似的Isession NHibernate的。):

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();

}

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

using语句是语法糖。它编译成一个try /终于在最终段的Dispose()调用阻塞。它确保处置将即使发生异常被调用。

您可以在一个类调用.Dispose(),而不使用“使用”的语句 - 通常你会做这在你的仓库的Dispose方法,如果你有一个

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top