Изменить внедренный сервис по событию из другого сервиса

Кросс-браузерное решение для проверки значений CSS без манипуляции с DOM:

function getStyleRuleValue(style, selector) {
    for (var i = 0; i < document.styleSheets.length; i++) {
        var mysheet = document.styleSheets[i];
        var myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
        for (var j = 0; j < myrules.length; j++) {
            if (myrules[j].selectorText && myrules[j].selectorText.toLowerCase() === selector) {
                return myrules[j].style[style];
            }
        }

    }
};

Использование:

getStyleRuleValue('backgroundColor', '.chart-color')

дезинфицированная версия (принудительно вводит ввод в строчный регистр и позволяет использовать case без ведущего ".")

function getStyleRuleValue(style, selector) {
var selector_compare=selector.toLowerCase();
var selector_compare2= selector_compare.substr(0,1)==='.' ?  selector_compare.substr(1) : '.'+selector_compare;

for (var i = 0; i < document.styleSheets.length; i++) {
    var mysheet = document.styleSheets[i];
    var myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
    for (var j = 0; j < myrules.length; j++) {
        if (myrules[j].selectorText) {
            var check = myrules[j].selectorText.toLowerCase();
            switch (check) {
                case selector_compare  :
                case selector_compare2 : return myrules[j].style[style];
            }
        }
    }

}

}

0
задан Nkosi 21 January 2019 в 11:29
поделиться

2 ответа

Я думаю, что здесь вы можете добавить еще одну абстракцию - абстрактную фабрику для Sb, например.

    public interface ISbFactory
    {
        SbFactory Create(string token);
    }

Клиентские классы, которые теперь имеют зависимости от Sb, должны изменить его на ISbFactory. При таком подходе вы возлагаете ответственность за установку токена на фабрику вместо изменения уже созданного сервиса.

0
ответ дан Bartek Falkowski 21 January 2019 в 11:29
поделиться

Как уже упоминалось в комментариях, вы можете создать фабричный класс, который будет отвечать за создание экземпляра Sb на основе предоставленного токена Sa.

public interface ISbFactory
{
    Sb Create();
}

public class SbFactory : ISbFactory
{
    private readonly Sa _sa;

    public SbFactory(Sa sa) => _sa = sa;

    public Sb Create()
    {
        var token = _sa.GrantToken();
        return new Sb(token);
    }
}

Использование

public class ConsumerOfSb
{
    private readonly ISbFactory _sbFactory;

    public ConsumerOfSb(ISbFactory sbFactory) => _sbFactory = sbFactory;

    public void Execute()
    {
        var sb = _sbFactory.Create();
        sb.ExecuteActionOne();
    }
}

Другой подход: внедрение зависимостей ASP.NET предоставляет методы перегрузки с «фабричным действием». Таким образом, вы можете зарегистрировать функцию, которая будет вызываться каждый раз, когда Sb экземпляр требуется как зависимость.

public void ConfigureServices(IServiceCollection services) 
{
    services.AddTransient(sa);
    services.AddTransient<Sb>(provider =>
    {
        var sa = provider.GetRequiredService<Sa>();
        var token = sa.GrantToken();
        return new Sb(token);
    });
}

При таком подходе потребителю Sb не нужно зависеть от фабрики.

0
ответ дан Nkosi 21 January 2019 в 11:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: