3

您好,我正在使用 MVC 4 和 C# 开发具有两个控制器的应用程序:第一个称为业务,它有一个称为 Create 的方法,该方法从另一个名为 PartnerController 的控制器调用一个称为 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() 方法

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

 The operation can not be completed because the DbContext has been disposed 

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

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

谢谢!

4

1 回答 1

6

我可以建议一种替代方法吗?

控制器不是业务逻辑的好地方;也就是说,它们不是“做事”的好地方。它经常在 MVC 教程和示例中以这种方式进行演示,但它实际上只对快速进入 MVC 有好处——这不是很好的做法。

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

相反,将您的逻辑提取到外部类。服务是一种设计模式,其中抽象出常用的业务逻辑。这样一来,事物就可以引用服务并执行逻辑,而无需对实现一无所知。

观察:

伙伴服务

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

}

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

于 2013-11-08T01:39:13.597 回答