8

注意:这里有 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 的问题(与上面的代码略有关联)是关于释放对象的。如果您看一下本教程:

http://codeofrob.com/archive/2010/09/29/ravenb-image-gallery-project-iii-the-application-lifecycle.aspx

最后一段代码:

ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();

这段代码的重点是防止会话泄漏。现在这是我还需要为 Autofac 担心的事情吗?如果是这样,我将如何在 Autofac 中执行此操作?

4

2 回答 2

11

我猜你想要类似的东西:

builder.Register(c => c.Resolve<DocumentStore>().OpenSession()).InstancePerLifetimeScope();

“设置了默认的 ASP.NET 和 WCF 集成,以便 InstancePerLifetimeScope() 将组件附加到当前的 Web 请求或服务方法调用。” - Autofac:InstanceScope

基本上,在 Web 应用程序中,InstancePerLifetimeScope处理每个 HTTP 上下文方面,并且还处理任何实现IDisposable.

于 2011-04-01T19:23:47.123 回答
1

还有一个问题是 OpenSession 返回 IDocumentSession 而不是 DocumentSession。更改我的班级以查找 IDocumentSession 以及执行 Jim 建议的工作,谢谢。

于 2011-04-03T22:53:06.630 回答