在我使用完服务后,我应该处理服务(层)类吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在我使用完服务后,我应该处理服务(层)类吗?相关的知识,希望对你有一定的参考价值。
所以我的项目中有一个包含所有业务逻辑的服务层。它是一个MVC项目,因此当用户调用需要某些逻辑的页面时,将实例化服务类,然后使用(来自控制器)。但它不会再次使用,因为新请求将再次实例化一个新对象。
我应该在使用它们之后处理这些服务类(使用'using'语句吗?或者我不会从中获得任何好处,因为垃圾收集器反过来不会太晚了?如果是这种情况,同样适用于使用我想我的存储库对象。
取决于您的服务层使用何种资源。
一般的经验法则:
如果有什么东西使用实现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
以上是关于在我使用完服务后,我应该处理服务(层)类吗?的主要内容,如果未能解决你的问题,请参考以下文章
我应该处理 WSASend() 可能不会发送所有数据的事实吗?