Ошибка при использовании простого инжектора внутри метода OAuth GrantResourceOwnerCredentials - PullRequest
0 голосов
/ 29 октября 2018

Я использую Simple Injector в своем проекте ASP.NET WEb API для внедрения зависимостей и OAuth для аутентификации. Для этого мне нужно разрешить интерфейс внутри метода GrantResourceOwnerCredentials, например:

using (IBusiness business = Injector.Container.GetInstance<IBusiness>())
{
}

Но когда он проходит в этой точке, он показывает мне эту ошибку:

Бизнес зарегистрирован как стиль жизни «Async Scoped», но экземпляр запрашивается вне контекста активной области действия (Async Scoped).

И я настраиваю свой контейнер с помощью одного метода:

public class Injector
{
    private static Container container;

    public static Container Container
    {
        get
        {
            if (container == null)
            {
                container = new Container();
                container.Options.DefaultLifestyle = Lifestyle.Scoped;
                container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
            }

            return container;
        }
    }

    public static TInstance GetInstance<TInstance>() where TInstance : class
    {
        return Container.GetInstance<TInstance>();

    }
}

Я регистрирую зависимости с помощью этого кода:

Injector.Container.Register<IBusiness, Business>(Lifestyle.Scoped);

1 Ответ

0 голосов
/ 30 октября 2018

Проблема заключалась в том, что когда я вызывал метод Injector.Container.GetInstance<IBusiness>() внутри GrantResourceOwnerCredentials, область действия контейнера была нулевой, и из-за этого он выдавал эту конкретную ошибку. Так что нужно было инициализировать область видимости, и я сделал это с помощью этого кода:

 using (SimpleInjector.Lifestyles.AsyncScopedLifestyle.BeginScope(Injector.Container))
 {
     using (IBusiness business = Injector.Container.GetInstance<IBusiness>())
     {
     }
 }

И измените defaultScopeLifestyle на гибридный в классе контейнера:

public static Container Container
        {
            get
            {
                if (container == null)
                {
                    container = new Container();

                    container.Options.DefaultScopedLifestyle = Lifestyle.CreateHybrid(
                        new AsyncScopedLifestyle(), new WebRequestLifestyle());
                }

                return container;
            }
        }
...