ASP.NET MVC 3, RavenDB и Autofac Issue Plus 2 Другие вопросы об Autofac - PullRequest
8 голосов
/ 01 апреля 2011

ПРИМЕЧАНИЕ. Здесь есть 3 вопроса, и я не задавал отдельные вопросы, поскольку все они в некоторой степени связаны с одним и тем же кодом.

У меня есть следующий код, который регистрирует соединениена мой RavenDB в Application_Start один раз за жизненный цикл приложения:

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)

Когда япопробуйте запустить это, я получаю следующую ошибку времени выполнения:

Не удается разрешить параметр 'Raven.Client.Document.DocumentSession Session' конструктора 'Void .ctor (Raven.Client.Document.DocumentStore, Raven.Client.Document.DocumentSession) '

Эта ошибка для меня звучит так, как будто Autofac не думает, что у него есть DocumentSession, однако именно так возвращает store.OpenSession ().Кто-нибудь знает, что будет причиной этой ошибки?Не правильно ли я устанавливаю переменную сеанса (она совпадает с переменной хранилища, которая работает нормально)?

Еще одна вещь, которая может или не может быть связана с вышеупомянутой проблемой, - это как добавить экземплярвозражать против Autofac за запрос вместо жизненного цикла приложений?В то время как объект RavenDB DocumentStore должен создаваться только один раз в течение жизненного цикла приложения, DocumentSession должен создаваться один раз для каждого запроса (возможно, его создание на уровне приложения вызывает вышеуказанную ошибку).

Последний вопрос, который я задам об Autofac (слегка связанный с приведенным выше кодом), касается освобождения объектов.Если вы посмотрите этот урок:

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

Последний фрагмент кода:

ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();

, и смысл этого кода состоит в том, чтобы предотвратить утечкусессий.Теперь это то, о чем я тоже должен беспокоиться для Autofac, и если да, то как бы я сделал это в Autofac?

Ответы [ 2 ]

11 голосов
/ 01 апреля 2011

Полагаю, вам нужно что-то вроде:

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

"Интеграции ASP.NET и WCF по умолчанию настроены так, что InstancePerLifetimeScope () будет прикреплять компонент к текущему веб-запросу или методу службывызов."- Autofac: InstanceScope

По сути, в веб-приложении InstancePerLifetimeScope обрабатывает один аспект в контексте HTTP, а также располагает любыми типами, которые реализуют IDisposable.

1 голос
/ 04 апреля 2011

Также была проблема, что OpenSession возвращает IDocumentSession вместо DocumentSession.Смена класса на поиск IDocumentSession и выполнение того, что предложил Джим, сработало, спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...