2017-01-16 6 views
0

Ich implementierte OAuthAuthorizationServerProvider. Ich injiziere IOAuthService (mein Dienst für die Authentifizierung) zur Implementierung von OAuthAuthorizationServerProvider. Die Implementierung von IOAuthService gibt DbContext über den Parameter contructor. OAuthAuthorizationServerProvider gibt DbContext als Singleton aus.inject dbcontext zu owin Middleware

Wie kann ich DbContext zu meiner Implementierung OAuthAuthorizationServerProvider mit Autofac mit per Web-Anfrage Umfang injizieren?

Wenn ich versuche, dbcontext mit folgendem Code zu registrieren:

builder.RegisterType<OAuthProviderContext>().As<DbContext>().InstancePerWebRequest(); 

dann werde ich einen Fehler: neue Rahmen nicht mit Httprequest in Verbindung gebracht werden könnte.

public class ADAuthorizationServerProvider : OAuthAuthorizationServerProvider 
    { 
     private readonly IAppSettings _appSettingsProvider; 
     private readonly IOAuthServiceProvider _oauthServiceProvider; 

    public ADAuthorizationServerProvider(IAppSettings appSettingsProvider, 
     IOAuthServiceProvider oauthServiceProvider) 
    { 
     _appSettingsProvider = appSettingsProvider; 
     _oauthServiceProvider = oauthServiceProvider; 
    } 

    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     //code 
    } 

public class OAuthServiceProvider : IOAuthServiceProvider 
    { 
     private readonly IRefreshTokenRepository _refreshTokenRepository; 
     private readonly IClientRepository _clientRepository; 
     private readonly IUserRepository _userRepository; 
     private readonly IUnitOfWork _unitOfWork; 



    public OAuthServiceProvider(IRefreshTokenRepository refreshTokenRepository, 
     IClientRepository clientRepository, 
     IUserRepository userRepository, 
     IUnitOfWork unitOfWork) 
    { 
     _refreshTokenRepository = refreshTokenRepository; 
     _clientRepository = clientRepository; 
     _userRepository = userRepository; 
     _unitOfWork = unitOfWork;    
    } 

    public async Task AddRefreshToken(RefreshToken token) 
    { 
     //code...    
    } 

    public async Task DeleteRefreshToken(string tokenId) 
    { 
     //code... 
    } 

    public async Task<Client> FindClient(string clientName) 
    { 
    //code... 
    } 

    public async Task<RefreshToken> FindRefreshToken(string tokenId) 
    { 
     //code... 
    } 

    public async Task<User> FindUser(string username) 
    { 
    //code... 
    } 
} 

public class ClientRepository : BaseReadonlyRepository<Guid, Client>,  IClientRepository 
{ 
    public ClientRepository(DbContext dbContext) : base(dbContext) 
    { 
    } 

    public async Task<Client> GetByName(string name) 
    { 
     //code... 
    } 
} 

public class RefreshTokenRepository : BaseRepository<string, RefreshToken>, IRefreshTokenRepository 
{ 
    public RefreshTokenRepository(DbContext dbContext) : base(dbContext) 
    { 
    } 
} 

public class UserRepository : BaseReadonlyRepository<Guid, User>, IUserRepository 
{ 
    public UserRepository(DbContext dbContext) : base(dbContext) 
    { 
    } 

    public async Task<User> GetByName(string username) 
    { 
     //code... 
    } 
} 

builder.RegisterType<OAuthProvider>().As<DbContext>().InstancePerLifetimeScope() //I give DbContext as singleton here. 

`

+0

Können Sie Ihren relevanten Code hinzufügen? – Wellspring

+1

Und formatieren Sie es richtig ... –

+0

Stack-Trace? Vollständige Ausnahme? Außerdem sagt die Frage, dass Sie 'InstancePerWebRequest' verwenden, aber der Code sagt' InstancePerLifetimeScope' - was ist das? –

Antwort

0

können Sie ein Feature von Autofac verwendet werden, solange die OAuthAuthroizationServerMiddleware wickeln wird. Auf diese Weise werden die OAuth-Middleware und alle zugehörigen Abhängigkeiten für jede Anforderung von Autofac instanziiert, sodass keine Singletons beteiligt sind.

Bitte lesen Sie sich die relevant documentation und eine Probe, die ich in this GitHub repository zusammen.

+0

Vielen Dank für Ihre Probe! –

Verwandte Themen