Как передать IHttpContextAccessor в пользовательский тег DotLiquid - PullRequest
0 голосов
/ 28 мая 2019

В моем приложении ASP.NET Core используется dotliquid .Я создаю свой собственный тег dotliquid и хочу вставить IHttpContextAccessor в мой собственный тег.Основываясь на моих исследованиях, я должен создать ITagFactory, чтобы создать тег и ввести IHttpContextAccessor.

моя фабрика

public class LiquidTagFactory : DotLiquid.ITagFactory
{
    private readonly Type _tagType;
    private readonly string _tagName;
    private readonly IHttpContextAccessor _contextAccessor;

    public string TagName { get { return _tagName; } }

    public LiquidTagFactory(Type tagType, string tagName, IHttpContextAccessor contextAccessor)
    {
        _tagType = tagType;
        _tagName = tagName;
        _contextAccessor = contextAccessor;
    }

    public Tag Create()
    {
        return (Tag)Activator.CreateInstance(_tagType, _contextAccessor);
    }
}

моя метка

public class TextBox : DotLiquid.Tag
{
    private string _html = null;
    private readonly IHttpContextAccessor _contextAccessor;

    public TextBox(IHttpContextAccessor contextAccessor)
    {
        _contextAccessor = contextAccessor;
    }

    public override void Initialize(string tagName, string markup, List<string> tokens)
    {
        // here i want to store some values into HttpContext.Items
        _contextAccessor.HttpContext.Items.Add("key","somedata");           

        base.Initialize(tagName, markup, tokens);
    }

    public override void Render(Context context, TextWriter result)
    {
       _html = CreateHtml();
        result.Write(_html);
        base.Render(context, result);
    }
}

Тогда я бы зарегистрировал эту фабрику как

 Template.RegisterTagFactory(new LiquidTagFactory(typeof(TexBox), "textbox", _httpContextAccessor));

Однако яиспользуя ASP.NET Core.Я не уверен, как зарегистрировать фабрику пользовательских тегов с помощью внедрения зависимостей .NET Core?

глядя на шаблон dotliquid код, он хранит ITagFactory в закрытом статическом поле

  private static Dictionary<string, Tuple<ITagFactory, Type>> Tags { get; set;}

В моем случае каждый запрос будет иметь свой IHttpContextAccessor,и я не хочу создавать фабрику для каждого запроса

1 Ответ

0 голосов
/ 28 мая 2019

Я думаю, что нашел это. Согласно SO мы можем зарегистрировать синглтон IHttpContextAccessor. Начиная с .NET Core 2.1, был добавлен метод расширения для правильной регистрации IHttpContextAccessor в качестве одиночного. Просто добавьте в метод ConfigureServices () следующее:

         services.AddHttpContextAccessor();

Это эквивалентно:

         services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

и затем зарегистрируйте фабрику в методе Configure () при запуске. Обязательно передайте IHttpContextAccessor в качестве параметра

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions<DomainOptions> domainOps, IHttpContextAccessor httpContextAccessor)
    {


        Template.RegisterTagFactory(new LiquidTagFactory(typeof(TextBox), "textbox", httpContextAccessor));
    }
...