使用从一个Controller到另一个Controller的DbContext变量

时间:2013-11-08 01:23:33

标签: c# asp.net-mvc entity-framework

您好我正在使用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服务器上发布我的代码时,应用程序会抛出异常。

谢谢!

1 个答案:

答案 0 :(得分:5)

我可以建议另一种方法吗?

控制器不是业务逻辑的好地方;那就是他们不是“做事”的好地方。它通常以这种方式在MVC教程和示例中进行演示,但它真的很适合快速进入MVC - 这不是很好的练习。

此外,控制器实际上不应该有自己调用的方法 - 或者从另一个Controller调用。控制器应该只包含它们的动作。

相反,将您的逻辑提取到外部类。 Service是一种设计模式,其中抽象出常用的业务逻辑。这样事情就可以引用服务并执行逻辑而不需要了解实现。

观察:

IPartnerService

public interface IPartnerService
{
    void CreatePartner(int partnerId);
}

DefaultPartnerService

public class DefaultPartnerService : IPartnerService
{
    private StoreContext db;

    public DefaultPartnerService()
    {
        db = new StoreContext();
    }

    public void CreatePartner(int partnerId)
    {
        // Something interesting
    }
}

BusinessController

public class BusinessController : Controller
{
    private IPartnerService _partnerService;

    public BusinessController()
    {
        _partnerService = new DefaultPartnerService();
    }

    public ActionResult Create(Business business)
    {
        _partnerService.CreatePartner(business.PartnerId);
        return RedirectToAction("Index");
    }

}

当然,出于教育目的,这种方法也大大简化了。这还不是最好的做法,但它可能会让你走上正轨。最终你会发现这种方法的问题,你会倾向于阅读有关存储库,工作单元,依赖注入等的信息。