什么是错把使用中的块存储库?
-
19-08-2019 - |
题
我已在库中的每一个方法,使用块。如果我要交叉引用的方法,现在看来,这将是对最佳实践来初始化另一个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方法,如果你有一个