C# 我是否应该在I';我用完了吗?
因此,我的项目中有一个服务层,它包含所有业务逻辑。它是一个MVC项目,因此当用户调用需要某些逻辑的页面时,服务类将被实例化,然后(从控制器)使用。但是它不会被再次使用,因为一个新的请求只会再次实例化一个新的对象 我应该在使用这些服务类之后(使用“using”语句)处理它们吗?还是因为垃圾收集器不会很晚出现,所以我不会从中获得任何好处?C# 我是否应该在I';我用完了吗?,c#,asp.net-mvc,memory-management,C#,Asp.net Mvc,Memory Management,因此,我的项目中有一个服务层,它包含所有业务逻辑。它是一个MVC项目,因此当用户调用需要某些逻辑的页面时,服务类将被实例化,然后(从控制器)使用。但是它不会被再次使用,因为一个新的请求只会再次实例化一个新的对象 我应该在使用这些服务类之后(使用“using”语句)处理它们吗?还是因为垃圾收集器不会很晚出现,所以我不会从中获得任何好处? 如果是这种情况,我想这同样适用于使用我的存储库对象。取决于您的服务层使用的资源类型 一般经验法则: 若任何东西使用实现了IDisposable的东西,那个么任何东
如果是这种情况,我想这同样适用于使用我的存储库对象。取决于您的服务层使用的资源类型 一般经验法则: 若任何东西使用实现了
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();
}
}
现在,如果我们想遵循规则,我们要么在使用repo的方法中处理存储库,要么在服务类中也实现IDisposable
。我们执行后者,因为现在调用方完成调用我们时,我们并不真正这样做(调用方可能调用服务中的两个方法)
最后,我们现在可以在控制器中执行此操作,以处理所有问题:
public ActionResult Execute()
{
using (var service = new MyService())
{
service.CallA();
service.CallB();
}
}
我建议您遵循谢谢,我的存储库使用了DatabaseConnection,但是,对于会话本身(nhibernate),我已经在使用'using(){}',所以我现在就不使用它了,也许如果我还有时间,我以后可以做一些比较/测试:)
public ActionResult Execute()
{
using (var service = new MyService())
{
service.CallA();
service.CallB();
}
}