Почему возникает ошибка «Область недоступна» при попытке зарегистрировать компонент с областью действия в ядре Windsor .net? - PullRequest
1 голос
/ 25 апреля 2019

Я пользуюсь Виндзорским замком.Я получаю

System.InvalidOperationException: 'Область не была доступна.Вы забыли вызвать container.BeginScope ()? '* Ошибка 1004 *

, когда я регистрирую стандартную библиотеку .NET в файле конфигурации MVC5 и пытаюсь использовать стиль жизни Scoped.Почему я получаю эту ошибку?

У меня есть проект MVC5, который ссылается на множество проектов библиотеки классов .NET Framework.Все эти проекты библиотек классов имеют классы установщика Windsor для регистрации в порядке вызова на основе файла конфигурации MVC5.Библиотечный замок.У Windsor есть PerWebRequest определение образа жизни, и оно использовалось во всех этих установщиках.

Теперь я представил стандартную библиотеку классов .NET и создал класс установщика, как и для всех предыдущих проектов, за исключением того, что я использую Scoped lifestyle вместоPerWebRequest (я где-то читал, что Scoped является заменой PerWebRequest в .net Core ), я добавил регистрационный код в конфигурацию MVC5, как и для остальных библиотек, и теперь я получаю исключение:

System.InvalidOperationException: 'Область не была доступна.Вы забыли вызвать container.BeginScope ()? '

Я видел подобный вопрос здесь: Область не была доступна.Вы забыли вызвать container.BeginScope ()? , но он не получил ответа, и разница в том, что я пытаюсь использовать стандартную библиотеку .NET в MVC5 с .NET Framework.

Это мой класс установщика:

public void Install(Castle.Windsor.IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
{
     container.Register(Component.For(typeof(IAzureSBConfiguration)).ImplementedBy(typeof(ConfigFileConfiguration)).LifestyleScoped());
}

Это регистрация файла конфигурации:

<install assembly="AzureSBQueuing" />

Я ожидал, что все будет работать нормально, как это было, когда вводилась стандартная библиотека классов .NET.Почему происходит ошибка?

1 Ответ

0 голосов
/ 04 мая 2019

.LifestyleScoped() не является заменой PerWebRequest.Если вы регистрируете сервис с помощью .LifestyleScoped(), вы должны разрешить его в области, созданной методом BeginScope.Но это не имеет ничего общего с AddScoped() из базового каркаса asp.net.

ASP.NET-MVC и ASP.NET-CORE - это совершенно разные фреймворки, поэтому их интеграция с Windsor поставляется с различными пакетами иимеют другой механизм определения области действия.

  • Для ASP.NET-MVC вы бы использовали свой известный .LifestylePerWebRequest()
  • Для ASP.NET-CORE вы бы использовали .LifestyleCustom<MsScopedLifestyleManager>() из пакета - https://github.com/volosoft/castle-windsor-ms-adapter

Поэтому в библиотеке .netstandard нет общей регистрации, которую вы могли бы использовать.

...