Предположим, у меня есть следующий слой структурированного проекта, такой как Репозиторий -> Сервис -> API снизу вверх, Пример кода:
Repository:
public interface IUserInfo
{
int UID{ get; set; }
}
public class UserInfo : IUserInfo
{
public int UID { get; set; }
}
public class ProductionRepository : Repository, IProductionRepository {
public ProductionRepository(IUserInfo userInfo, StoreDbContext dbContext) : base(userInfo, dbContext)
{}
//...
}
Услуги:
public class ProductionService : Service, IProductionService {
public ProductionService(IUserInfo userInfo, StoreDbContext dbContext)
: base(userInfo, dbContext)
{
}
//...
}
public abstract class Service {
protected IProductionRepository m_productionRepository;
public Service(IUserInfo userInfo, StoreDbContext dbContext)
{
UserInfo = userInfo;
DbContext = dbContext;
}
protected IProductionRepository ProductionRepository
=> m_productionRepository ?? (m_productionRepository = new ProductionRepository(UserInfo, DbContext));
}
API:
public class ProductionController : Controller {
private readonly IUserInfo userInfo;
protected IProductionService ProductionBusinessObject;
public ProductionController(IUserInfo _userInfo, IProductionService productionBusinessObject)
{
userInfo = _userInfo;
ProductionBusinessObject = productionBusinessObject;
}
}
Теперь в моем файле Startup.cs я использую токен JWT с событием " OnTokenValidated " для получения информации UserInfo из токена:
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.Events = new JwtBearerEvents
{
#region Jwt After Validation Authenticated
OnTokenValidated = async context =>
{
#region Get user's immutable object id from claims that came from ClaimsPrincipal
var userID = context.Principal.Claims.Where(c => c.Type == ClaimTypes.NameIdentifier)
services.Configure<UserInfo>(options =>
{
options.UID = userID;
});
#endregion
},
#endregion
}
};
Я использую services.Configure и пытаюсь назначить UID для объекта IUserInfo, но когда я отлаживаю в своем контроллере, IUserInfo всегда представляет нулевой объект, как в конструкторе или методе API. . Я знаю, что, вероятно, неправильно использую Внедрение зависимостей в ядре .Net, поэтому, пожалуйста, не стесняйтесь указывать мне, как правильно вставить этот IUserInfo в мой Controller -> Service -> Repository , поэтому все из них можно получить актуальную информацию UserInfo!