HtmlSanitizer + ASP.NET Core 2 с DI - PullRequest
       41

HtmlSanitizer + ASP.NET Core 2 с DI

1 голос
/ 23 сентября 2019

Когда я использую HtmlSanitizer без DI, он работает хорошо.

HtmlSanitizer без DI:

HtmlSanitizer without DI

Но когда я хочу получить HtmlSanitizer, используя DI.

  1. Я добавил в файл Startup.cs:

    services.AddSingleton<IHtmlSanitizer, HtmlSanitizer>();
    
  2. Я использовал конструкторхранилища для получения экземпляра IHtmlSanitizer, но во внедренном экземпляре HtmlSanitizer AllowedTags и AllowAttributes пусты.

HtmlSanitizer с DI:

HtmlSanitizer with DI

Как я могу получить HtmlSanitizer с заполненными свойствами, используя DI?

1 Ответ

2 голосов
/ 23 сентября 2019

Фреймовая работа пытается внедрить необязательные параметры конструктора

    public HtmlSanitizer(IEnumerable<string> allowedTags = null, IEnumerable<string> allowedSchemes = null,
        IEnumerable<string> allowedAttributes = null, IEnumerable<string> uriAttributes = null, IEnumerable<string> allowedCssProperties = null, IEnumerable<string> allowedCssClasses = null)
    {
        AllowedTags = new HashSet<string>(allowedTags ?? DefaultAllowedTags, StringComparer.OrdinalIgnoreCase);
        AllowedSchemes = new HashSet<string>(allowedSchemes ?? DefaultAllowedSchemes, StringComparer.OrdinalIgnoreCase);
        AllowedAttributes = new HashSet<string>(allowedAttributes ?? DefaultAllowedAttributes, StringComparer.OrdinalIgnoreCase);
        UriAttributes = new HashSet<string>(uriAttributes ?? DefaultUriAttributes, StringComparer.OrdinalIgnoreCase);
        AllowedCssProperties = new HashSet<string>(allowedCssProperties ?? DefaultAllowedCssProperties, StringComparer.OrdinalIgnoreCase);
        AllowedAtRules = new HashSet<CssRuleType>(DefaultAllowedAtRules);
        AllowedCssClasses = allowedCssClasses != null ? new HashSet<string>(allowedCssClasses) : null;
    }

Source

, что приводит к использованию пустых коллекций контейнером DI для инициализацииtarget HtmlSanitizer class.

В этом случае используйте делегат фабрики при регистрации класса и вызовите конструктор (как это было сделано, если не использовать DI)

services.AddSingleton<IHtmlSanitizer>(_ => new HtmlSanitizer());

Или просто создайтеэкземпляр и зарегистрируйте его в контейнере DI

IHtmlSanitizer sanitizer = new HtmlSanitizer();
services.AddSingleton<IHtmlSanitizer>(sanitizer);
...