你不能只使用一个类来管理通过 DI 注册为单例的类吗?那么实际上与您的旧静态内容相同。
(我假设这是用于您的服务器和其他服务器之间的通信,不直接涉及您的 api 客户端)
如果您不喜欢一直漂浮着某种臃肿的大单例的想法,您可以使用类似这样的方法简单地将令牌的 storage 抽象掉:
public interface ITokenStore
{
string GetCurrentToken();
void SetToken(string token);
}
public class TokenStore : ITokenStore
{
private DateTime _tokenRefreshedAt;
private string _currentToken;
public string GetCurrentToken()
{
//if we last got the token more than 23 hours ago,
//just reset token
if (lastTokenRefreshed.AddHours(23) < DateTime.Now)
{
_currentToken = null;
}
return _currentToken;
}
public void SetCurrentToken(string token)
{
_currentToken = token;
}
}
然后将其注册为单例(不熟悉Unity,因此调整语法以适应):
container.RegisterSingleton<ITokenStore, TokenStore>();
然后您需要令牌的服务可以使用每个请求或瞬态生命周期进行注册,并且只需执行以下操作:
class SomeService
{
private ITokenStore _tokenStore;
public SomeService(ITokenStore tokenStore)
{
_tokenStore = tokenStore;
}
public string DoThings(params..)
{
var currentToken = _tokenStore.GetCurrentToken();
if (currentToken == null)
{
currentToken = GetNewTokenSomehow();
_tokenStore.SetCurrentToken(currentToken);
}
.... Do other things....
}
}
您可以让 tokenstore 类本身获取新令牌,但如果它的生命周期是单例的,那么您注入的任何服务也必须如此,所以我可能会有一个按请求生命周期的 TokenManager它处理所有这些,但它本身使用单例令牌存储或其他东西....