我正在开始一个MVC项目,已经完成了MvcMusicStore教程。我试图了解POCO生成的数据/实体上下文是如何存储的。
在示例中,控制器生成实体上下文的副本,并且所有操作都在那里完成:
MusicStoreEntities storeDB = new MusicStoreEntities();
//
// GET: /Store/
public ActionResult Index()
{
// Retrieve list of Genres from database
var genres = from genre in storeDB.Genres
select genre.Name;
[...]
如果我要将我的解决方案分成几层,那么保留上下文的标准做法(或关键选项)是什么?我是否在控制器中生成它,并将其传递给存储库,或者存储库是否可以保留一般用途的副本?
据我所知,使用工作单元模式是必要的。
我的图层是:
我的其他问题: - 生成上下文的开销是多少? - 由于没有.Close(),并且它没有实现IDisposable,它背后的ObjectContext是否会生成单独的连接,连接池,共享单个实例? - 如果ObjectContext在层/操作之间传递太多,是否可以锁定它?
提前致谢。
答案 0 :(得分:6)
我不想在这里讨论太多细节/代码,所以我只想提一些观点:
答案 1 :(得分:2)
我为每个控制器创建一个存储库,并将我的上下文放在那里。我遵循的规则是存储库处理我可能想要模拟的任何东西(不是真正的存储库定义,但它适用于我)。如有必要,存储库可以调用其他存储库,但控制器不应该知道它。 Context是存储库的实例属性,是按需创建的(我还没有进入IOC)。如果存储库调用另一个存储库,则它会传递Context实例。
看起来有点像......
public class MyController : Controller
{
public IMyControllerRepository Repository { get; set; }
public ActionResult MyAction(int id)
{
var model = Repository.GetMyModel(id);
return View(model);
}
}
public class MyControllerRepository : IMyControllerRepository
{
public MyContext Context { get; set; };
public MyModel GetMyModel(int id)
{
return (from m in Context.MyModels
where m.ID = id
select m).SingleOrDefault();
}
}