【发布时间】:2019-06-12 14:45:09
【问题描述】:
需要帮助。
我有一个 .netcore 2.1 API,它通过来自其客户端的 Azure Bearer 令牌进行保护。我想从客户端的不记名令牌中收集用户信息并将其存储在 SQL 数据库中,以便在添加/删除/编辑等时标记数据库中的条目。因此,对于 SQL 表连接,我需要用户SQL 中的信息。
下面是我使用 IDistributedCache 实现的缓存服务。在初始化时,我试图将所有当前存储的用户从 SQL DB 加载到缓存中,然后在新用户连接时添加到缓存中。
为了捕获整个 API 之间的连接,我使用 TypeFilterAttribute 来执行 OnActionExecuting。
问题是 CacheService 是一个单例并且正在调用 UserRepository - 这是范围内的。这是不允许的。
有什么想法吗?
startup.cs
public void ConfigureServices(IServiceCollection services)
{
...
// Context
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.TryAddSingleton<CacheService>();
// Repositories
services.TryAddScoped<IUserRepository, UserRepository>();
services.AddDistributedMemoryCache();
services.AddMvc(
opts => opts.Filters.Add(new HttpInterceptor())
)
...
CacheService.cs
public class CacheService
{
private readonly IDistributedCache _cache;
private readonly IUserRepository _userRepository;
public CacheService(
IDistributedCache cache,
[FromServices] IUserRepository userRepository
)
{
_cache = cache;
_userRepository = userRepository;
// Populate cache from DB
var users = _userRepository.GetAll().Result;
foreach (var u in users)
{
if (_cache.GetAsync(u.Username).Result == null)
{
var profileSerialised = JsonConvert.SerializeObject(UserToUserProfile(u));
var entry = Encoding.UTF8.GetBytes(profileSerialised);
_cache.SetAsync(u.Username, entry, new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30) });
}
}
}
HttpInterceptor.cs
public class HttpInterceptor : TypeFilterAttribute
{
public HttpInterceptor() : base(typeof(IHttpInterceptor))
{
}
private class IHttpInterceptor : IActionFilter
{
private readonly CacheService _cache;
private readonly IUserRepository _userRepository;
public IHttpInterceptor(
CacheService cache,
IUserRepository userRepository)
{
_cache = cache;
_userRepository = userRepository;
}
public void OnActionExecuting(ActionExecutingContext context)
{
if (context.HttpContext.User.Identity.IsAuthenticated)
{
this._cache.GetUserProfile(context.HttpContext.User.Identity.Name);
}
}
【问题讨论】:
标签: asp.net-core dependency-injection asp.net-core-2.0 repository-pattern