取决于你的服务层使用什么样的资源。
一般经验法则:
如果任何东西使用了实现 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