What is the best pattern to use LINQ to C#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class CommonService
{
private readonly DataContext _context ;
public CommonRepository ()
{
_context = new DataContext ();
}
public CommonRepository (DataContext context )
{
_context = context ;
}
public List GetAll ()
{
var query = from m in _context .MyModel
select m ;
return m .ToList();
}
} |
或
1 2 3 4 5 6 7 8 9 10 11 12
| public class CommonService
{
public List GetAll ()
{
using (DataContext context = new DataContext ())
{
var query = from m in context .MyModel
select m ;
return m .ToList();
}
}
} |
或者你有更多的图案,请建议我。
- 请注意,您的问题是:"我应该在恰好使用LINQ的代码中使用/允许依赖项注入吗?"-答:是的……请澄清你在寻求什么样的建议。
- @Alexeilevenkov,这是真的,但正如你所指出的,如果不知道CommonService的终身行为,很难评估。如果它以任何方式是单例的,永久的数据上下文将是一个非常糟糕的主意。
- 没有办法…
- 但他不值得投反对票。
- @沃尔特,你说这是一般规则吗?或者只是在这个特定的案例中?不管怎样,我相信如果有足够的参数,这里会有一个"最佳"的答案。
- @当谈到模式和软件架构时,你几乎不能谈论the best ultimate solution。这取决于程序员决定什么最适合他和具体的情况,而这并不是一个判断这个问题的地方。我们所能做的就是提出多种选择,但我有点怀疑这种答案是否适合这里……列举各种方法、它们的优缺点等太宽泛了。是的,你可以说第一个他举的例子很糟糕,并解释了原因,但你不能说第二个例子是最好的…
- @沃尔特,我搞不懂你为什么这么笼统地说话。对于这个问题,一个选项可能会泄漏内存。如果给两个选择,其中一个是坏的,那么选择另一个几乎不是什么意见。我怀疑这只是你对他使用"最好"这个词的克内杰克反应,这并没有什么帮助。
- @沃尔特,很明显你正在尽最大努力找出一种解释问题的方法,这种方法对手术的帮助最小。我试着用另一种方法。
- 这个问题属于栈交换网络中的另一个站点,特别是代码审查。
这里有一个主要的区别:第一个代码示例在服务的生命周期内保持一个单独的数据上下文,而第二个示例为每个操作旋转一个新的数据上下文。第二个例子通常是正确的,因为有了变更跟踪,DataContext会变得很大,如果有其他东西调用SubmitChanges(),您可以意外地提交不想提交的内容。
请参见Linq to SQL DataContext的多个/单个实例
- 型一个含糊不清的问题的好答案。需要强调的一点是,长时间保留数据上下文几乎总是一个非常糟糕的主意。
您可以使用这两种模式,但一定要确保上下文的使用寿命很短。第一个选项允许您在CommonService中创建需要上下文的方法,但不必在每个方法中创建一个。所以它可以防止重复的代码。此外,它还允许IOC容器通过构造函数注入将上下文注入到CommonService中。
如果你选择第一个选项(我倾向于这样做),你可以考虑让CommonService实现IDisposable,给它一个处理上下文的aDispose方法。这也将鼓励您在using结构中使用CommonService,从而限制其寿命。