如何将运行时字符串参数添加到依赖项解析链中?

How do you add a runtime string parameter into a dependency resolution chain?

如何为这种设置设置我选择的 DI:

public abstract class BaseRepo
{
     public BaseRepo(string token)
     {
     }
}

public RepoA : BaseRepo, IRepoA
{
     // implementation of interface here    
}

public ViewModelA
{
     IRepoA _repo;
     public ViewModelA(IRepoA repo)
     {
       this._repo = repo;
     }

     public DoMethod()
     {
        this._repo.DoSomeStuff();
     }
}

在实际场景中,基础class上的令牌参数是在用户登录后解析的。我想在登录后只为DI配置接口,但我不确定是否做正确的事。

我查看了一些 Factory,但无法正常工作。

我选择的 DI 大概是 AutoFac/Ninject 项目是 Xamarin 移动应用

In real scenario, the token parameter on the base class is resolved after the user has been logged in.

这意味着令牌参数是运行时数据。防止将运行时数据注入组件。您的组件应该是无状态的。相反,运行时数据应该通过先前构造的组件对象图的方法调用传递。如果不这样做,将使配置和验证对象图变得更加复杂。

通常有多种传递运行时数据的方法。您可以通过对象图从一个方法到另一个方法的方法调用传递它,或者您的组件调用一个 returns 正确值的方法。此标记似乎是上下文信息,这通常意味着您选择后一个选项:

public interface ITokenProvider {
    string GetCurrentToken();
}

// Don't use base classes: base classes are a design smell!
public RepoA : IRepoA
{
     private readonly ITokenProvider tokenProvider;
     public RepoA(ITokenProvider tokenProvider) {
        this.tokenProvider = tokenProvider;
     }

     // IRepoA methods
     public A GetById(Guid id) {
         // Get token at runtime
         string token = this.tokenProvider.GetCurrentToken();

         // Use token here.
     }
}

在您的 Composition Root 中,您必须为此 ITokenProvider 创建一个实现。此实现的外观在很大程度上取决于您希望如何存储此令牌,但这是一个可能的实现:

public sealed class AspNetSessionTokenProvider : ITokenProvider {
    public string GetCurrentToken() {
        return (string)HttpContext.Current.Session["token"];
    }
}