У меня следующая проблема:
У меня есть 2
услуги:
Sa
Sb
.
Чтобы пользователь мог использовать sb
, ему необходимо выполнить действие в Sa
, которое предоставит ему token
.
Затем он будет использовать этот token
для всех действий, которые он будет выполнять над Sb
.
Я не хочу, чтобы все методы Sb
нуждались в token
в качестве аргумента. Я хочу вставить Sb
в servicecollection
с самого начала и иметь возможность сохранить этот token
как внутреннее свойство (после того, как пользователь использует Sa
),
Как я могу это сделать? Как я могу изменить внедренный сервис на основе действия в другом сервисе.
Служба, предоставляющая токен
public class Sa{
//grants token
public string GrantToken(string username);
}
Сервис с настраиваемым свойством для события
public class Sb{
private internalService internalService;
public ClassName(InternalService internalService)
{
this.internalService=internalService;
}
public string Token{get;set;}
///all these actions would need the user to provide the token as parameter
/// i want to somehow set the `Token` property of Sb after the Sa grants the token
public void Action1(/*string token */){
this.internalService.DoAction1(Token);
}
public void Action2(/*string token */){
this.internalService.DoAction2(Token);
}
public void ActionN(){
this.internalService.DoActionN(Token);
}
}
//internal service that needs the token
public class InternalService
{
public void DoAction1(string token);
public void DoAction2(string token);
//.....//
public void DoActionN(string token);
}
`
Запуск
public void ConfigureServices(IServiceCollection services) {
Sa sa=new Sa();
Sb sb=new Sb(); //i want this injected from the get-go but to have the `Token` property set-able
InternalService ins=new InternalService();
services.AddSingleton(ins);
services.AddTransient(sa);
services.AddTransient(sb);
}
Сценарий
// мы находимся в классе, в котором есть и Sa, и Sb
var token=sa.GrantToken();
//i want now this token to be passed to Sb so i can then call its actions //without the need of the token
var result1=sb.Action1();
var result2=sb.Action2();
......
var resultN=sb.ActionN(); //<--