在具有EF模型的典型MVC3应用程序中,每个控制器都实例化其自己的模型容器副本。这意味着如果我要在不同的文件中创建一个类并且需要访问模型,则需要实例化它自己的容器。
请考虑以下事项:
namespace X.Web.Controllers
{
public class TestController : Controller
{
EFContainer db = new EFContainer();
public ActionResult Whatever()
{
User u = db.Users.Find(3);
...
}
如果我想抽象我在类Auth
中提取用户,那么它必须实例化自己的db
,因为它无法访问控制器 - 所有这一切都很好,直到controller想要对返回的对象进行更改:
public ActionResult Whatever()
{
User u = Auth.GetUser();
u.Name = "ekkis";
db.SaveChanges();
...
}
因为此时的用户属于不同的上下文...所以要么我必须与db
分享我的Auth
,要么我不得不做一个愚蠢的双重查找:< / p>
public ActionResult Whatever()
{
int id = Auth.GetUserId();
User u = db.Users.Find(id);
u.Name = "ekkis";
db.SaveChanges();
...
}
推荐的解决方法是什么?
答案 0 :(得分:1)
为什么不通过构造函数注入将模型/ EF上下文传入Auth
类?这似乎是最合理的方式(一旦你设置了IOC容器,实际上同样适用于你的控制器。)
public class Auth
{
public Auth(EFContainer db)
{
//...
}
}
理想情况下,您还可以根据抽象界面进行此项工作,以便您可以独立于EF测试Auth
。