Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.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
autofac、ASP.NET集成和Dispose_Asp.net_Autofac - Fatal编程技术网

autofac、ASP.NET集成和Dispose

autofac、ASP.NET集成和Dispose,asp.net,autofac,Asp.net,Autofac,这里是Autofac新手,但我喜欢我目前看到的。我试图利用已解析对象的请求生存期,但在确认请求完成后是否实际发生了dispose时遇到了问题 我有一个一次性的对象,我在页面请求开始时得到,在页面请求结束时处理。我现在正在使用autofac获取对象的一个实例,我想看看autofac是否会为我进行处理 我已经在所讨论的对象上插入了Dispose()方法,当我的页面执行生命周期管理时,我可以看到它“启动”。如果我不处理自己,但让autofac处理,我看不到任何证据 我使用指令来配置东西,包括web.c

这里是Autofac新手,但我喜欢我目前看到的。我试图利用已解析对象的请求生存期,但在确认请求完成后是否实际发生了dispose时遇到了问题

我有一个一次性的对象,我在页面请求开始时得到,在页面请求结束时处理。我现在正在使用autofac获取对象的一个实例,我想看看autofac是否会为我进行处理

我已经在所讨论的对象上插入了Dispose()方法,当我的页面执行生命周期管理时,我可以看到它“启动”。如果我不处理自己,但让autofac处理,我看不到任何证据


我使用指令来配置东西,包括web.config和global.asax更改。我能够很好地实例化这个对象,但我不能判断它是否真的被处理了。还有其他步骤吗?

Dispose只是一个允许您定义“Dispose”方法的接口。需要一次性类的最常见用途是,该类中是否有应显式释放的资源(例如windows资源句柄)。在大多数情况下,IDisposable接口是不需要的,因为垃圾收集器非常强大,在管理内存方面会做得更好。然而,显然有很多情况下必须立即释放句柄,这就引出了下一点,IDisposable的实现

不要做什么:

var myClass = MyDisposableClass();

// do stuff with myClass

myClass.Dispose();


Proper usage:

using (var myClass = MyDisposableClass())
{
    // do stuff with myClass
}
编译器将有效地构建与以下内容相同的内容:

MyDisposableClass myClass = MyDisposableClass();
try
{
    // do stuff with myClass
}
finally
{
    myClass.Dispose();
}

重要的区别在于,无论发生什么,您都知道您的Dispose将被调用。此外,您可以绑定一个析构函数(如果存在,则由垃圾收集器调用),然后绑定该析构函数以调用Dispose方法;但是,如果出于任何原因需要执行此操作,请确保不要释放同一资源两次(释放后将指针设置为null)。

无论是在页面中手动释放对象还是让Autofac模块执行此操作,在请求生命周期中释放对象的时间都会有所不同。在HttpApplication.EndRequest被触发之前,它不会启动,也不会启动您的对象,而HttpApplication.EndRequest处于请求生命周期的最后


根据您跟踪对象Dispose方法调用的方式,您可能看不到输出。您如何检测您的Dispose方法

重复您的回复:

大多数情况下,这种情况都会发生(在任何情况下) (IoC容器)你会找到那个 沿着一条链的组件 依赖项是一个单例

例如

A->B->C

如果A是“工厂”,B是“单件” C是“工厂”,然后解析A 将获得对singleton的引用 B、 它将始终引用 同样的C

为了创建一个新的C 每次解析A时,B也必须 是“工厂”

我知道了

我为对象实例请求了错误的容器-我为对象请求了应用程序容器,而不是请求容器


谢谢你抽出时间。我知道怎么处理。我的目标是能够交换实现,而页面不必知道它们是否是一次性的。Autofac的子容器生命周期管理应该做到这一点,而ASP.NET集成应该在请求的生命周期内管理这一点。我只是想确认它是否真的发生了。问得好,彼得-我试过三件事。前两个显示nothing-response.write和httpcontext.trace,这两个都可以用时间来解释。但第三个是事件日志的编写,它也没有显示任何内容。我同意。对事件日志的跟踪不应受到请求生命周期的影响。嗯,是的,这个问题通常很难解决。我通常使用更多的DI工具而不是服务定位器工具,所以我不会遇到这种情况。有一次我的nhibernate会话被引用锁定了我的开发数据库。。。那里有很多乐趣。