В моем приложении 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
,и я не хочу создавать фабрику для каждого запроса