Я остро нуждаюсь в вашей помощи.Я перенес некоторые устаревшие приложения .Net web API в ядро .net и заставил все это работать, кроме части Envers.Основная проблема, с которой я сталкиваюсь, заключается в передаче имени пользователя RevisionListener.Поскольку RevisionListener не поддерживает DI, я не могу ввести HttpContextAccessor для получения контекста.В качестве альтернативы, если я использую статический HttpContextAccessor, я работаю с тем же контекстом из двух разных запросов.
Даже если я использую «IHttpContextAccessor» из-за статической природы таблицы Revision, таблица содержит один и тот же контекст между двумя запросами от 2 разных пользователей.
Любой пример будет оценен!
Вот код, который я использую для настройки nHibernate
// Метод NHibernateExtension для включения nhiberbate в общедоступный статический класс ядра .net NHibernateExtension
{
public static void AddNhibernate(this IServiceCollection services, string connectionString,string schemaName )
{
services.AddSingleton((provider) =>
{
var cfg = new NHibernate.Cfg.Configuration();
cfg.Configure("hibernate.cfg.xml");
cfg.SetProperty("connection.connection_string", connectionString);
cfg.AddProperties(new Dictionary<string, string>
{
{ NHibernate.Cfg.Environment.DefaultSchema, schemaName }
});
cfg.AddMapping(NHibernateConfig.GetMappings());
var enversConfiguration = GetEnversConfiguration();
cfg.SetEnversProperty(ConfigurationKey.DefaultSchema, "Audit");
cfg.IntegrateWithEnvers(enversConfiguration);
return cfg;
});
services.AddSingleton((provider) => provider.GetService<NHibernate.Cfg.Configuration>().BuildSessionFactory());
services.AddScoped((provider) => provider.GetService<ISessionFactory>().OpenSession());
}
private static FluentConfiguration GetEnversConfiguration()
{
var enversConf = new FluentConfiguration();
var userId = HttpContext.Current?.Request?.Headers["user_name"];
var userName = HttpContext.Current?.Request?.Headers["name"];
RevisionListener rn = new RevisionListener(userName, userId);
enversConf.SetRevisionEntity<RevisionDetails>(x => x.Id, x => x.RevisionTimestamp, rn);
enversConf.Audit<PrinterMapping>().SetTableInfo(x => x.Value = typeof(PrinterMapping).Name);
enversConf.Audit<Label>().SetTableInfo(x => x.Value = typeof(Label).Name);
enversConf.Audit<Language>().SetTableInfo(x => x.Value = typeof(Language).Name);
enversConf.Audit<Translation>().SetTableInfo(x => x.Value = typeof(Translation).Name);
return enversConf;
}
}
// это обеспечивает HttpContext через IHttpContextAccessor
открытый статический класс HttpContext
{
private static IHttpContextAccessor _contextAccessor;
public static Microsoft.AspNetCore.Http.HttpContext Current => _contextAccessor.HttpContext;
internal static void Configure(IHttpContextAccessor contextAccessor)
{
_contextAccessor = contextAccessor;
}
}
* / слушатель **** /
открытый класс RevisionListener: IRevisionListener {
private string _userName = string.Empty;
private string _userId = string.Empty;
public RevisionListener(string userName, string userId)
: base()
{
this._userName = userName;
this._userId = userId;
}
public void NewRevision(object revisionEntity)
{
var casted = revisionEntity as RevisionDetails;
if (casted != null)
{
casted.UserName = this._userName;
casted.UserId = this._userId;
}
}
}