Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我是否应该在I';我用完了吗?_C#_Asp.net Mvc_Memory Management - Fatal编程技术网

C# 我是否应该在I';我用完了吗?

C# 我是否应该在I';我用完了吗?,c#,asp.net-mvc,memory-management,C#,Asp.net Mvc,Memory Management,因此,我的项目中有一个服务层,它包含所有业务逻辑。它是一个MVC项目,因此当用户调用需要某些逻辑的页面时,服务类将被实例化,然后(从控制器)使用。但是它不会被再次使用,因为一个新的请求只会再次实例化一个新的对象 我应该在使用这些服务类之后(使用“using”语句)处理它们吗?还是因为垃圾收集器不会很晚出现,所以我不会从中获得任何好处? 如果是这种情况,我想这同样适用于使用我的存储库对象。取决于您的服务层使用的资源类型 一般经验法则: 若任何东西使用实现了IDisposable的东西,那个么任何东

因此,我的项目中有一个服务层,它包含所有业务逻辑。它是一个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();
    }
}
现在,如果我们想遵循规则,我们要么在使用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();
    }
}