C# 如何在存储库中正确地处置Linq to SQL DataContext?

C# 如何在存储库中正确地处置Linq to SQL DataContext?,c#,asp.net-mvc,linq-to-sql,repository,datacontext,C#,Asp.net Mvc,Linq To Sql,Repository,Datacontext,在Rob Conery样式的ASP.NET MVC应用程序中,通常有一个存储库: public class CustomerRepository { DataContext dc = new DataContext(); public IQueryable<Customer> AllCustomers() { return db.Customers; } public Customer GetCustomer(int cus

在Rob Conery样式的ASP.NET MVC应用程序中,通常有一个存储库:

public class CustomerRepository
{
    DataContext dc = new DataContext();

    public IQueryable<Customer> AllCustomers()
    {
        return db.Customers;
    }

    public Customer GetCustomer(int customerID)
    {
        return db.Customers.FirstOrDefault(c => c.CustomerID = customerID);
    }
}
当请求通过路由引擎路由到控制器时,该控制器通过ASP.NET MVC核心引擎中的控制器工厂进行实例化。然后在控制器上执行适当的方法


假设我想在DataContext中实现
IDisposable
,那么如何正确地
处置
DataContext,而不必为存储库中的每个方法重新实例化DataContext?

使存储库可丢弃,并在其Dispose方法中处置DataContext


如果您想知道是谁处理了repo,Rob可能会使用一个IOC容器,该容器将为每个请求向控制器注入一个实例,并在请求结束时自动处理repo。

实际上
DataContext
IDisposable
。您应该使用(CustomerRepository\u repository=new CustomerRepository()){…}将controller中的每个操作包装在
中,并通过调用
ds.Dispose()

@Mehrdad在存储库中实现
IDisposable
:这个问题就是整个“Dispose vs not Dispose”的争论。这不是这里要问的问题。我们需要一个新标签[罗布·科纳利风格];-)当控制器超出范围时,是否有一种方法可以执行此操作,这样我就不必对每个控制器方法重复此操作?Andrey:如果您使用
块将每个操作包装在一个
中,那么您的存储库不必实现IDisposable。或者实现IDisposable,不用担心在使用blockRobert时包装数据上下文:永远不要这样做,永远不要依赖于超出范围。我有一个严重的生产问题,因为这一点。手册总是更好。Ram:您可以使用CustomerRepository,因为它不实现IDisposebleDoes,因为IOC容器知道一次性对象(即实现IDispose的对象)?是的。autofac是我最喜欢的这种东西的容器。低调的方法是使用using块在每个操作中实例化和处理容器
public class CustomerController: Controller
{
    CustomerRepository _repository;

    public ActionResult Index()
    {
        var data = _repository.AllCustomers();
        return view("Index", data);
    }

    public ActionResult Details(int id)
    {
        var data = _repository.GetCustomer(id);
        if (data !=null)
            return view("Details", data);
        else
            return view("NotFound");
    }
}