C# 将dbcontext注入owin中间件

C# 将dbcontext注入owin中间件,c#,entity-framework,asp.net-web-api,owin,autofac,C#,Entity Framework,Asp.net Web Api,Owin,Autofac,我实现了OAuthAuthorizationServerProvider。我将IOAuthService(我的身份验证服务)注入到OAuthAuthorizationServerProvider的实现中。 IOAuthService的实现通过构造函数的参数提供DbContext。因此,OAuthAuthorizationServerProvider将DbContext作为单例提供 如何将DbContext注入到我的实现中OAuthAuthorizationServerProvider使用Auto

我实现了
OAuthAuthorizationServerProvider
。我将
IOAuthService
(我的身份验证服务)注入到
OAuthAuthorizationServerProvider
的实现中。 IOAuthService的实现通过构造函数的参数提供DbContext。因此,OAuthAuthorizationServerProvider将DbContext作为单例提供

如何将
DbContext
注入到我的实现中
OAuthAuthorizationServerProvider
使用
Autofac
和每个web请求作用域

如果我尝试使用以下代码注册
dbcontext

builder.RegisterType<OAuthProviderContext>().As<DbContext>().InstancePerWebRequest();
builder.RegisterType().As().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.
公共类ADAuthorizationServerProvider:OAuthAuthorizationServerProvider
{
私人只读IAppSettings\u应用程序设置Provider;
私有只读IOAuthServiceProvider\u oauthServiceProvider;
公共授权服务器提供程序(IAppSettings应用程序设置提供程序,
IOAuthServiceProvider(oauthServiceProvider)
{
_appSettingsProvider=appSettingsProvider;
_oauthServiceProvider=oauthServiceProvider;
}
公共重写异步任务ValidateClientAuthentication(OAuthValidateClientAuthenticationContext)
{
//代码
}
公共类OAuthServiceProvider:IOAuthServiceProvider
{
专用只读IRefreshTokenRepository\u refreshTokenRepository;
私人只读IClientRepository\u clientRepository;
专用只读IUserRepository\u userRepository;
私人只读i工作单元(unitof工作单元);;
公共OAuthServiceProvider(IRefreshTokenRepository刷新TokenRepository,
IClientRepository clintrepository,
IUserRepository用户存储库,
i工作单元(工作单元)
{
_refreshTokenRepository=refreshTokenRepository;
_clientRepository=clientRepository;
_userRepository=userRepository;
_unitOfWork=unitOfWork;
}
公共异步任务AddRefreshToken(RefreshToken令牌)
{
//代码。。。
}
公共异步任务DeleteRefreshToken(字符串令牌ID)
{
//代码。。。
}
公共异步任务FindClient(字符串clientName)
{
//代码。。。
}
公共异步任务FindRefreshToken(字符串令牌ID)
{
//代码。。。
}
公共异步任务FindUser(字符串用户名)
{
//代码。。。
}
}
公共类客户端存储:BaseReadonlyRepository、IClientRepository
{
公共ClientRepository(DbContext-DbContext):基(DbContext)
{
}
公共异步任务GetByName(字符串名称)
{
//代码。。。
}
}
公共类RefreshTokenRepository:BaseRepository、IRefreshTokenRepository
{
公共RefreshTokenRepository(DbContext DbContext):基本(DbContext)
{
}
}
公共类UserRepository:BaseReadonlyRepository,IUserRepository
{
公共用户存储库(DbContext DbContext):基本(DbContext)
{
}
公共异步任务GetByName(字符串用户名)
{
//代码。。。
}
}
builder.RegisterType().As().InstancePerLifetimeScope()//我在这里将DbContext作为singleton提供。

`

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


请通读和我放在一起的一个示例。

你能包括你的相关代码吗?并将其正确格式化…堆栈跟踪?完全异常?此外,问题说你正在使用
InstancePerWebRequest
,但代码上写着
InstancePerLifetimeScope
-是哪一个?谢谢你的示例!