Asp.net mvc 3 ASP.NET MVC 3、RavenDB和;Autofac问题加上2个其他Autofac问题

Asp.net mvc 3 ASP.NET MVC 3、RavenDB和;Autofac问题加上2个其他Autofac问题,asp.net-mvc-3,dependency-injection,autofac,ravendb,Asp.net Mvc 3,Dependency Injection,Autofac,Ravendb,注意:这里有3个问题,我没有单独提问,因为它们在某种程度上都与同一代码相关。 我有以下代码,用于在应用程序中注册到我的RavenDB的连接\u每个应用程序的生命周期启动一次: var store = new DocumentStore { Url = "http://localhost:8080" }; store.Initialize(); builder.RegisterInstance(store).SingleInstance(); 现在,它可以正常工作,并且在应用程序的生命周期中只

注意:这里有3个问题,我没有单独提问,因为它们在某种程度上都与同一代码相关。

我有以下代码,用于在应用程序中注册到我的RavenDB的连接\u每个应用程序的生命周期启动一次:

var store = new DocumentStore { Url = "http://localhost:8080" };
store.Initialize();

builder.RegisterInstance(store).SingleInstance();
现在,它可以正常工作,并且在应用程序的生命周期中只应该创建一次。现在我想将DocumentSession添加到Autofac中,因此我尝试在应用程序启动时添加:

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会话”

对我来说,这个错误听起来好像Autofac不认为它有DocumentSession,但是store.OpenSession()返回的是DocumentSession,所以它应该返回。有人知道是什么导致了这个错误吗?我是否没有正确设置会话变量(它与正常工作的store变量相同)

与上述问题相关或不相关的另一件事是,我如何根据请求而不是应用程序生命周期向Autofac添加对象实例?虽然RavenDB DocumentStore对象在应用程序生命周期中只应创建一次,但DocumentSession应在每个请求中创建一次(可能是根据应用程序级别创建它导致了上述错误)

关于Autofac,我最后要问的一个问题(与上面的代码稍微相关)是关于释放对象的问题。如果您看一下本教程:

最后一段代码:

ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();

这段代码的目的是防止会话泄漏。现在,对于Autofac,我是否也需要担心这一点?如果是这样,我将如何在Autofac中做到这一点?

我猜您需要类似以下内容:

builder.Register(c => c.Resolve<DocumentStore>().OpenSession()).InstancePerLifetimeScope();
builder.Register(c=>c.Resolve().OpenSession()).InstancePerLifetimeScope();
“设置默认ASP.NET和WCF集成,以便InstancePerLifetimeScope()将组件附加到当前web请求或服务方法调用。”-


基本上,在web应用程序中,
InstancePerLifetimeScope
处理每个HTTP上下文方面的一个,并且还处理实现
IDisposable
的任何类型。OpenSession还存在一个问题,即OpenSession返回IDocumentSession而不是DocumentSession。将我的课程改为寻找IDocumentSession,并按照Jim的建议进行操作,谢谢。

@ryanzec:InstancePerLifetimeScope非常值得深入了解。Autofac的作者有一篇关于容器背后的用途以及容器在应用程序中的位置的优秀文章: