2017-01-16 24 views
0

我实现了OAuthAuthorizationServerProvider。我将IOAuthService(我的认证服务)注入到OAuthAuthorizationServerProvider的实施中。 IOAuthService的实现通过构造函数的参数给出了DbContext。所以,OAuthAuthorizationServerProvider将DbContext作为一个单例。注入dbcontext到owin中间件

如何在每个Web请求范围内使用AutofacDbContext注入我的实施OAuthAuthorizationServerProvider

如果我尝试使用下面的代码来注册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. 

`

+0

你能否包含你的相关代码? – Wellspring

+1

并正确格式化... –

+0

堆栈跟踪?完全例外?此外,问题说你正在使用'InstancePerWebRequest',但代码说'InstancePerLifetimeScope' - 这是什么? –

回答

0

您可以使用Autofac提供的功能,将包裹OAuthAuthroizationServerMiddleware。这样OAuth中间件及其所有依赖关系将由Autofac为每个请求实例化,因此不涉及任何单例。

请仔细阅读relevant documentation和样本我放在一起this GitHub repository

+0

谢谢你的样品! –