Кросс-браузерное решение для проверки значений 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];
}
}
}
}
}
Я думаю, что здесь вы можете добавить еще одну абстракцию - абстрактную фабрику для Sb, например.
public interface ISbFactory
{
SbFactory Create(string token);
}
Клиентские классы, которые теперь имеют зависимости от Sb, должны изменить его на ISbFactory. При таком подходе вы возлагаете ответственность за установку токена на фабрику вместо изменения уже созданного сервиса.
Как уже упоминалось в комментариях, вы можете создать фабричный класс, который будет отвечать за создание экземпляра 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
не нужно зависеть от фабрики.