2017-01-16 4 views
0

OAuthAuthorizationServerProviderを実装しました。私はOAuthAuthorizationServerProviderの実装にIOAuthService(私の認証サービス)を注入します。 IOAuthServiceの実装は、コンストラクタのパラメータを介してDbContextを返します。したがって、OAuthAuthorizationServerProviderはDbContextをシングルトンとして提供します。ミドルウェアをコミットするためにdbcontextを挿入

私の実装にDbContextを挿入するにはOAuthAuthorizationServerProviderAutofacをWebリクエストスコープごとに使用するにはどうすればよいですか?

私は、次のコードを使用して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

あなたがOAuthAuthroizationServerMiddlewareをラップしますAutofacが提供する機能を使用することができます。そのようにして、OAuthミドルウェアとそのすべての依存関係は、リクエストごとにAutofacによってインスタンス化されるため、シングルトンは含まれません。

relevant documentationを読んで、this GitHub repositoryにまとめたサンプルをお読みください。

+0

サンプルありがとう! –

関連する問題