Добавить NHibernate с .net core - Добавить аудит через HttpContext - PullRequest
0 голосов
/ 12 ноября 2018

Я остро нуждаюсь в вашей помощи.Я перенес некоторые устаревшие приложения .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;
    }
}

} ​​

...