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
-是哪一个?谢谢你的示例!