2014-01-22 22 views
2

所以我在我的项目中有一个包含所有业务逻辑的服务层。这是一个MVC项目,因此当用户调用需要某些逻辑的页面时,服务类将被实例化并使用(从控制器)。但它不会再被使用,因为新的请求会再次实例化一个新的对象。我完成使用后应该处理一个服务(层)类吗?

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

回答

4

取决于你的服务层使用的是什么样的资源

一般的经验法则:

如果说有什么用一些东西,然后实现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

+0

谢谢你,我的仓库使用databasa连接,但是,会议本身(nhibernate)我已经在使用'using(){}'所以我现在就离开它,也许如果我有时间了,我可以稍后做一些比较/测试:) – NeedACar

相关问题