【发布时间】:2023-03-27 04:53:02
【问题描述】:
注意:这里有 3 个问题,我没有提出单独的问题,因为它们都与相同的代码有些相关。
我有以下代码,每个应用程序的生命周期都会在 Application_Start 中注册一次与我的 RavenDB 的连接:
var store = new DocumentStore { Url = "http://localhost:8080" };
store.Initialize();
builder.RegisterInstance(store).SingleInstance();
现在这可以正常工作,并且在每个应用程序的生命周期中应该只创建一次。现在我想将 DocumentSession 添加到 Autofac,所以我尝试在 Application_Start 中添加:
var session = store.OpenSession();
builder.RegisterInstance(session).SingleInstance();
在我的 UserRepository 中,我有以下构造函数:
public UserRepository(DocumentStore store, DocumentSession session)
当我尝试运行它时,出现以下运行时错误:
无法解析构造函数“Void .ctor(Raven.Client.Document.DocumentStore, Raven.Client.Document.DocumentSession)”的参数“Raven.Client.Document.DocumentSession Session”
对我来说,这个错误听起来像是 Autofac 认为它没有 DocumentSession 但这就是 store.OpenSession() 返回的内容,所以它应该返回。任何人都知道会导致此错误的原因是什么?我没有正确设置会话变量(它与正常工作的存储变量相同)?
另一件可能与上述问题相关或不相关的事情是,如何根据请求而不是根据应用程序生命周期将对象的实例添加到 Autofac?虽然 RavenDB DocumentStore 对象应该只在生命应用程序周期中创建一次,但 DocumentSession 应该在每个请求中创建一次(可能每个应用程序级别创建它会导致上述错误)。
关于 Autofac 的最后一个问题(与上面的代码略有相关)是关于释放对象的。如果您看一下本教程:
最后一段代码:
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
这段代码的重点是防止会话泄漏。现在这是我还需要为 Autofac 担心的事情吗?如果是这样,我将如何在 Autofac 中做到这一点?
【问题讨论】:
标签: asp.net-mvc-3 dependency-injection autofac ravendb