Dbcontext注册为“作用域”或“瞬态”对关闭数据库连接有影响吗

时间:2019-08-26 14:34:26

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

我对ASP.NET MVC中的DI有基本的了解,但是有一个问题困扰我很多,将Dbcontext注册为“作用域”或“瞬态”有什么区别吗?以下是典型的mvc应用程序的一些代码:

public class EmployeeController : Controller
{
    private EmployeeContext _context;

    public EmployeeController(EmployeeContext context)
    {
        _context = context;
    }

    public ActionResult Index()
    {
        return View(context.Employees.ToList());
    }

    ...//other action methods that access context's DbSet
}

假设我们将EmployeeContext注册为临时服务。因此,在我们运行该应用程序之后,该应用程序将监听所有传入的请求。 假设发生了对默认/ Home / Index的http请求,因此需要创建EmployeeController的新实例,因此DI将首先向控制器的构造函数提供EmployeeContext的实例。 _context也可用于所有其他操作方法,并且无需在其他地方创建新的EmployeeContext服务。

因此,在请求完成之后,_context也被处置。那么它与范围服务的效果不一样吗?我们打算将其注册为“临时”服务,最后它的工作方式类似于“范围”服务,因此将Dbcontext注册为“范围”或“临时”真的不重要吗?

1 个答案:

答案 0 :(得分:6)

如果您不使用任何其他注入的服务(也在使用DBContext),则作用域和瞬态之间没有区别。

但是,如果您使用其他注入的服务,并且在DBContext上使用“瞬态”,则每个服务都会获得其自己的实例。为了避免这种情况,您应该始终在DBContext上使用“作用域”。

在具有以下代码的示例中,使用“临时” EmployeeContext的每个请求将有两个实例:

override fun onMapReady(googleMap: GoogleMap) {
    this.mClusterManager = ClusterManager(context!!, this.googleMap, this)
    this.eventsCollection = this.mClusterManager.markerManager.newCollection()
    this.googleMap.setOnCameraIdleListener(this.mClusterManager)
    this.googleMap.setOnMarkerClickListener(this.mClusterManager.markerManager)
    this.mClusterManager.setOnClusterItemClickListener { item ->
         Logger.d("Item clicked: $item")
         //Do stuff with items on set 'A'
         true
    }
    this.eventsCollection.setOnMarkerClickListener {
         Logger.d("Item clicked $it")
         //Do stuff with items on set 'B'
         true
    }
}

fun addSetBToMap(){
    ...
    val markerOption = MarkerOptions()
        .position(latitudeLongitude)
        .alpha(0f) --> //this alpha is changed in other functions

    this.eventsCollection.addMarker(markerOption)
    val pinnedMarker = googleMap.addMarker(
        markerOption
    )

    pinnedMarker.tag = MarkerType.EVENT
    pinnedMarker.zIndex = 2.0f
}