Внедрение зависимостей (с использованием SimpleInjector) и OAuthAuthorizationServerProvider

Впервые в Dependency Injection, так что это, вероятно, простой вопрос, но я попробовал и не могу понять, я использую Simple Injector.

У меня есть WebApi, который отлично использует SimpleInjector, теперь я хотел бы реализовать безопасность с помощью OAuth.

Для этого я начал следовать этому уроку, который очень полезен, но не использует Dependancy Injection

http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/

У меня есть файл global.asax, похожий на этот, для настройки внедрения зависимости (работает отлично)

protected void Application_Start()
{
    SimpleInjectorConfig.Register();

    GlobalConfiguration.Configure(WebApiConfig.Register);
}

Я создал файл Startup.Auth.cs для настройки OAuth

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
            Provider = new MyAuthorizationServerProvider() // here is the problem
        };

        // Token Generation
        app.UseOAuthAuthorizationServer(OAuthServerOptions);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
    }
}

Теперь, как я прокомментировал выше, MyAuthorizationServerProvider является проблемой. он принимает параметр IUserService, который я обычно внедряю. Я не хочу очищать конструктор, потому что мой IUserService также внедряет репозиторий. Вот файл

public class ApiAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
    private IUserService _service;
    public ApiAuthorizationServerProvider (IUserService service) 
    {
         _service = service;
    }

    public override async Task ValidateClientAuthentication(
        OAuthValidateClientAuthenticationContext context)
    {
        context.Validated();
    }

    public override async Task GrantResourceOwnerCredentials(
        OAuthGrantResourceOwnerCredentialsContext context)
    {
        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", 
            new[] { "*" });

        IUserService service = Startup.Container.GetInstance<IUserService>();
        User user = _service.Query(e => e.Email.Equals(context.UserName) &&
            e.Password.Equals(context.Password)).FirstOrDefault();

        if (user == null)
        {
            context.SetError("invalid_grant", 
                "The user name or password is incorrect.");
            return;
        }

        var identity = new ClaimsIdentity(context.Options.AuthenticationType);
        identity.AddClaim(new Claim("sub", context.UserName));
        identity.AddClaim(new Claim("role", "user"));

        context.Validated(identity);

    }
}

Как я могу заставить это работать с Внедрением Зависимости? Это должно случиться довольно много и должно быть в состоянии сделать что-то, чтобы справиться с этим. Я уверен, что это что-то простое, но я все еще учусь.

Ответы на вопрос(4)

Ваш ответ на вопрос