我有一个运行 MVC3 的小项目。我使用 LINQ 从数据库中获取数据。我使用与 MVC3 附带的预制示例相同的架构设计来构建我的项目。在这样的项目中,应用程序被拆分,在本主题中,我想重点关注 Model.cs 文件。我现在每个控制器都有一个,举个例子,我有一个 HighscoreController.cs 和一个 HighscoreModels.cs。在模型类中,我定义了一个 Service 类,它引用了一个数据上下文和一些使用这个数据上下文来查询数据库的方法。现在我遇到了一个问题,其中一些方法正在执行相同的查询,因此我想建立一个访问数据库的中心点,所以我想我会实现存储库模式,所以我做到了。
private IRepository _repository;
public HighscoreService()
: this(new Repository())
{ }
public HighscoreService(IRepository repository)
{
_repository = repository;
}
现在数据库调用在存储库中处理,并且通过 _repository 引用从 Service 类使用存储库。
我的存储库是这样构建的:
public class Repository : IRepository
{
private MyDataContext _dataContext;
public Repository()
{
_dataContext = new MyDataContext();
}
public Member MemberByName(string memberName)
{
Member member = CompiledQueries.MemberByName(_dataContext, memberName);
return member;
}
}
当我尝试将 DataLoadOptions 与此存储库模式结合使用时,就会出现我面临的问题。
因为当您使用 dataloadoptions 时,在应用新的 dataloadoptions 之前,您必须没有对数据上下文进行过先前的查询。而且由于我的存储库在所有方法中都重用了数据上下文,所以这根本行不通。我一直在尝试两件事,一是通过 using 语句在每个方法中重新创建数据上下文,以确保每次都刷新数据上下文。但是,当我将存储库中的结果返回到我的模型中并且范围在存储库模式内耗尽时,我遇到了问题,因为 using 语句结束,这意味着结果不能与例如 .Count() 或 .Count() 一起使用。 ToList() 因为为我提供数据的数据上下文已被终止。我还尝试了另一种解决方案,它在整个存储库中使用相同的数据上下文,但在每个使用 dataloadoptions 的方法中创建一个新实例。这感觉很脏;)那么任何人都可以给我一个关于如何将 DataLoadOptions 与存储库模式一起使用的建议吗?并避免我刚才描述的问题。或者我不应该使用 dataloadoptions 并选择另一种方式吗?顺便说一下,我使用 DataLoadOptions 的原因是我想从相关表中获取一些数据。
作为一个小问题:在上面的代码示例中,您可以看到我已将 CompiledQueries 放在它自己的 .cs 文件中。这是一个糟糕的设计吗?是否有关于在 MVC 应用程序中放置已编译查询的位置的指南?
感谢您阅读并希望我的问题有一些答案;)提前非常感谢。如果您需要更多信息,请询问。