所以我在我的项目中有一个包含所有业务逻辑的服务层。这是一个MVC项目,因此当用户调用需要某些逻辑的页面时,服务类将被实例化并使用(从控制器)。但它不会再被使用,因为新的请求会再次实例化一个新的对象。我完成使用后应该处理一个服务(层)类吗?
我应该在使用它们之后处理这些服务类(使用'using'语句吗?或者我不会从中获得任何好处,因为垃圾回收器不会晚得多吗? 如果是这种情况, 。同样适用于使用我的资源库对象我想
所以我在我的项目中有一个包含所有业务逻辑的服务层。这是一个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
谢谢你,我的仓库使用databasa连接,但是,会议本身(nhibernate)我已经在使用'using(){}'所以我现在就离开它,也许如果我有时间了,我可以稍后做一些比较/测试:) – NeedACar