【问题标题】:Should I dispose a service (layer)-class after I'm done using it?我应该在使用完服务(层)类后处理它吗?
【发布时间】:2018-03-05 16:41:42
【问题描述】:

所以我的项目中有一个包含所有业务逻辑的服务层。它是一个 MVC 项目,所以当用户调用需要一些逻辑的页面时,服务类被实例化然后使用(从控制器)。但它不会被再次使用,因为新请求只会再次实例化一个新对象。

我应该在使用这些服务类之后处理它们(使用“使用”语句吗?或者我不会从中获得任何好处,因为垃圾收集器不会迟到吗? 如果是这种情况,我猜这同样适用于使用我的存储库对象。

【问题讨论】:

    标签: c# asp.net-mvc memory-management


    【解决方案1】:

    取决于你的服务层使用什么样的资源。

    一般经验法则:

    如果任何东西使用了实现 IDisposable 的东西,那么任何东西都应该实现 IDisposable 或在完成某物后调用 Dispose()

    为什么?假设服务层使用数据库连接。如果您不处置它们,它们将保持打开状态,直到垃圾收集器收集它们,从而导致大量空闲连接。这也意味着 ADO.NET 连接池必须为每个新 HTTP 请求创建新连接,而不是重用旧连接(当池最终变空时)。

    确保IDisposables 被释放是一种有效利用资源的廉价方式。

    所以如果你得到这样的东西:

    public class MyService
    {
        public MyRepository _repos = new MyRepository();
    
        // [...]
    }
    
    public class MyRepository
    {
        public SqlConnection _connection = new SqlConnection("...");
    
        // [...]
    }
    

    您应该首先将您的存储库更改为IDisposable

    public class MyRepository : IDisposable
    {
        public SqlConnection _connection = new SqlConnection("...");
    
        // [...]
    
        public void Dipose()
        {
            _connection.Dispose();
        }
    }
    

    现在,如果我们想遵循规则,我们要么必须在使用 repos 的方法中处理存储库,要么在服务类中实现 IDisposable。我们这样做是因为当调用者完成调用我们(调用者可能调用服务中的两个方法)时,我们现在并没有真正做到。

    public class MyService : IDisposable
    {
        public MyRepository _repos = new MyRepository();
    
        // [...]
    
        public void Dipose()
        {
            _repos.Dispose();
        }
    }
    

    最后,我们现在可以在控制器中执行此操作来处理所有内容:

    public ActionResult Execute()
    {
        using (var service = new MyService())
        {
            service.CallA();
            service.CallB();
        }
    }
    

    我建议您关注Dispose pattern

    【讨论】:

    • 谢谢,我的存储库使用数据库连接,但是,对于会话本身 (nhibernate) 我已经在使用 'using(){}' 所以我现在就离开它,也许如果我有时间我可以稍后做一些比较/测试:)
    猜你喜欢
    • 2022-10-23
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2022-01-05
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多