我有一个应用程序,它被分成4层,以保持代码的组织性并能够重用它。
我的层次是:
因此,我们的想法是,对于每个控制器或我们的mvc项目,我们有一个业务类和一个数据类。如果某些功能需要使用其他类上的代码,则在业务逻辑层这样做(不同的业务逻辑类可以创建其他业务逻辑类的新实例)。
我遇到的问题是,我创建了太多的DbContext,并因此而产生了一些错误和问题。就像松开BL层上的延迟加载一样,或者当其他对象来自不同的DbContext时,无法将像list这样的对象分配给其他对象。
例如,如果我有一个医疗控制器/逻辑/数据,并且使用一个病人逻辑/数据来获取今天的病人列表,那么当我尝试执行medic.patients = patienstList;时,我会得到一个错误。
所以,我需要做的是在每个web请求中使用一个DbContext,这样DbContext就会在控制器上创建,并注入到逻辑层,然后注入到其他逻辑类或数据类中?
我该怎么做呢?
发布于 2013-12-02 15:47:36
在MVC中有许多做IOC的方法。团结..。您可以在其中注册一个DBContext实例。
当然,如果您IOC容器的生存期超出了web请求的范围。你的时间过得真不顺。即使您认为您需要的是每个请求的一个上下文。如果您使用ASP管道事件并访问DbContext,请非常小心,每个线程实际上可能需要一个上下文。但是如果您很高兴地说,您的访问是从MVC控制器级别开始的。然后,您正在寻找一种方法,以处理倒置的控制。
发布于 2013-12-02 15:51:10
IMHO业务对象不应该使用另一个业务对象,因为这违反了单一责任原则。
数据层对象应该能够完成Business需要它做的所有事情。
因此,您应该在业务层对象和数据层对象方法GetPatientsForMedic中编写方法。
你可能会说,“但医院业务对象可以很容易地给我一个医院列表”。这不是工作,因为你说过它的工作是为医院的管理者服务。
但是,这个问题只在您将一个Hospital对象从HospitalsBO传递给MedicBO时才会发生。所以别这样。
在医院控制器上,编写一个方法GetListOfHospitalIDsAndNames。然后,如果您需要下拉医院,调用它,并使用if和文本名称。
通过共享一个工作单元,您确实可以在两个业务对象之间共享一个DbContext。但你可能不该。
但是我不是专家..。我避免了这些问题,因为我有一个庞大的业务对象,其中包含了所有的东西。这也是一件坏事。
https://stackoverflow.com/questions/20331912
复制相似问题