我有一个小项目,我正在运行MVC3。 我使用LINQ从数据库中获取数据。 我使用与MVC3附带的预制示例相同的架构设计构建了我的项目。 在这样的项目中,应用程序被分割,在这个主题中,我想关注Model.cs文件。目前,我对每个控制器都有一个,所以作为一个例子,我有一个HighscoreController.cs和一个HighscoreModels.cs。在模型类中,我定义了一个Service类,该类引用了datacontext以及一些使用此datacontext查询数据库的方法。 现在我遇到了这些方法中的一些正在执行相同查询的问题,因此我想让访问数据库的中心点,所以我想我会实现存储库模式,所以我做了。 因此,而不是在服务类具有一个DataContext的引用我现在有这样的资源库的引用:MVC,存储库模式和DataLoadOptions
private IRepository _repository;
public HighscoreService()
: this(new Repository())
{ }
public HighscoreService(IRepository repository)
{
_repository = repository;
}
现在数据库中调用存储库中进行处理和存储库从服务类中使用通过_repository参考。
我的仓库是建立这样的:
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之前,您一定没有对datacontext进行过查询。由于我的存储库在所有方法中都重用了数据上下文,这根本不起作用。 我一直在尝试2件事,一种是通过using语句重新创建每个方法中的datacontext,以确保每次刷新datacontext。但是,当我从存储库中取回结果返回到我的模型中并且范围在存储库模式内部运行时,随着using语句结束,我遇到了问题,这意味着结果不能用于例如。 .Count()或.ToList()是因为为我提供数据的datacontext已终止。我还尝试了另一种解决方案,它在整个存储库中使用相同的datacontext,但在每个使用dataloadoptions的方法中创建一个新实例。这感觉非常肮脏;) 所以任何人都可以给我一个关于如何使用DataLoadOptions与存储库模式的建议?并避免我刚刚描述的问题。或者我应该不使用dataloadoptions并选择另一种方式来做到这一点?我使用DataLoadOptions的原因是我想从相关表中获取一些数据。
作为一个小问题:在上面的代码示例中,您可以看到我已将CompiledQueries放入自己的.cs文件中。这是一个糟糕的设计?在MVC应用程序中将编译查询放在哪里有任何指导原则吗?
感谢您的阅读并希望我的问题有一些答案;)提前致谢。如果您需要更多信息,只需询问。
我不是专家,但我认为将数据上下文保留在“请求范围”中的想法可能有所帮助。这样,每个HTTP请求都会创建一个新的上下文,这可能会消除您的一些问题。像Ninject这样的IoC容器可以帮助解决这个问题。虽然它涉及实体框架,但以下文章可能会有所帮助:http://buildstarted.com/2010/08/24/dependency-injection-with-ninject-moq-and-unit-testing/ – ngm 2012-04-09 13:13:22
注入您的存储库并进行设置按照WebRequest的生活方式。目前还不确定存储库为您做了什么,除了添加无用的抽象层。 – CrazyCoderz 2012-04-09 20:45:00