您好我正在使用MVC 4和C#开发一个具有两个控制器的应用程序: 第一个名为Business,它有一个名为Create的方法,它从另一个名为PartnerController的Controller中调用一个名为CreatePartner的方法。
public class BusinessController : Controller
{
private storeContext db = new storeContext();
public ActionResult Create(Business business)
{
//Some stuff here
PartnerController pt = new PartnerController();
pt.CreatePartner(int partner_id);
//Here is another stuff that uses db DbContext variable
return RedirectToAction("Index");
}
}
这是第二个叫做合作伙伴的控制器
public class PartnerController : Controller
{
private storeContext db = new storeContext();
public void CreatePartner(int partner_id)
{
//Some interesting stuff
}
}
每个控制器都有Dispose()方法
问题是:在我从Business控制器调用CreatePartnet方法后,我尝试再次使用db变量来保存其他数据,但它会引发以下异常:
The operation can not be completed because the DbContext has been disposed
- 使用从一个控制器到另一个具有相同DbContext变量名称的方法的最佳方法是什么?
- 奇怪的事情发生了:我的东西在本地工作,但是当我在IIS服务器上发布我的代码时,应用程序会抛出异常。
谢谢!
答案 0 :(得分:5)
我可以建议另一种方法吗?
控制器不是业务逻辑的好地方;那就是他们不是“做事”的好地方。它通常以这种方式在MVC教程和示例中进行演示,但它真的很适合快速进入MVC - 这不是很好的练习。
此外,控制器实际上不应该有自己调用的方法 - 或者从另一个Controller调用。控制器应该只包含它们的动作。
相反,将您的逻辑提取到外部类。 Service是一种设计模式,其中抽象出常用的业务逻辑。这样事情就可以引用服务并执行逻辑而不需要了解实现。
观察:
public interface IPartnerService
{
void CreatePartner(int partnerId);
}
public class DefaultPartnerService : IPartnerService
{
private StoreContext db;
public DefaultPartnerService()
{
db = new StoreContext();
}
public void CreatePartner(int partnerId)
{
// Something interesting
}
}
public class BusinessController : Controller
{
private IPartnerService _partnerService;
public BusinessController()
{
_partnerService = new DefaultPartnerService();
}
public ActionResult Create(Business business)
{
_partnerService.CreatePartner(business.PartnerId);
return RedirectToAction("Index");
}
}
当然,出于教育目的,这种方法也大大简化了。这还不是最好的做法,但它可能会让你走上正轨。最终你会发现这种方法的问题,你会倾向于阅读有关存储库,工作单元,依赖注入等的信息。