在我使用完服务后,我应该处理服务(层)类吗?

问题描述 投票:3回答:1

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

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

c# asp.net-mvc memory-management
1个回答
6
投票

取决于您的服务层使用何种资源。

一般的经验法则:

如果有什么东西使用实现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

© www.soinside.com 2019 - 2024. All rights reserved.