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

Ces*_*llo 3 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");
  }
}
Run Code Online (Sandbox Code Playgroud)

这是第二个叫做合作伙伴的控制器

public class PartnerController : Controller
{
   private storeContext db = new storeContext();

   public void CreatePartner(int partner_id)
  {
      //Some interesting stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

每个控制器都有Dispose()方法

问题是:在我从业务控制器调用CreatePartnet方法后,我尝试再次使用db变量来保存其他数据,但它会抛出以下异常:

 The operation can not be completed because the DbContext has been disposed 
Run Code Online (Sandbox Code Playgroud)

- 使用从一个控制器到具有相同DbContext变量名称的另一个控制器的方法的最佳方法是什么?

- 奇怪的事情发生了:我的东西在本地工作,但是当我在IIS服务器上发布我的代码时,应用程序会抛出异常.

谢谢!

Row*_*man 5

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

控制器不是业务逻辑的好地方; 那就是他们不是"做事"的好地方.它通常以这种方式在MVC教程和示例中演示,但它实际上只对快速进入MVC有好处 - 这不是很好的练习.

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

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

注意:

IPartnerService

public interface IPartnerService
{
    void CreatePartner(int partnerId);
}
Run Code Online (Sandbox Code Playgroud)

DefaultPartnerService

public class DefaultPartnerService : IPartnerService
{
    private StoreContext db;

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

    public void CreatePartner(int partnerId)
    {
        // Something interesting
    }
}
Run Code Online (Sandbox Code Playgroud)

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");
    }

}
Run Code Online (Sandbox Code Playgroud)

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