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.
`
Können Sie Ihren relevanten Code hinzufügen? – Wellspring
Und formatieren Sie es richtig ... –
Stack-Trace? Vollständige Ausnahme? Außerdem sagt die Frage, dass Sie 'InstancePerWebRequest' verwenden, aber der Code sagt' InstancePerLifetimeScope' - was ist das? –