Я внедрил OAuthAuthorizationServerProvider
. Я ввожу IOAuthService
(мой сервис для аутентификации) в реализацию OAuthAuthorizationServerProvider
. Реализация IOAuthService дает DbContext через параметр contructor. Таким образом, OAuthAuthorizationServerProvider предоставляет DbContext как одноэлементный.вводят dbcontext в промежуточное ПО owin
Как я могу ввести DbContext
в мою реализацию OAuthAuthorizationServerProvider
с использованием Autofac
с областью веб-запроса?
Если я пытаюсь зарегистрировать dbcontext
, используя следующий код:
builder.RegisterType<OAuthProviderContext>().As<DbContext>().InstancePerWebRequest();
тогда я получаю сообщение об ошибке: Новая область не может быть связано с HttpRequest.
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.
`
Можете вложить свой код? – Wellspring
И отформатировать его должным образом ... –
Stack trace? Полное исключение? Кроме того, в этом вопросе говорится, что вы используете 'InstancePerWebRequest', но код говорит' InstancePerLifetimeScope' - что это? –