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

Dependency injection 如何将运行时字符串参数添加到依赖项解析链中?,dependency-injection,ninject,autofac,Dependency Injection,Ninject,Autofac,如何为这种设置设置我选择的DI: public abstract class BaseRepo { public BaseRepo(string token) { } } public RepoA : BaseRepo, IRepoA { // implementation of interface here } public ViewModelA { IRepoA _repo; public ViewModelA(IRep

如何为这种设置设置我选择的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();
     }
}
在实际场景中,基类上的令牌参数在用户登录后解析。我想在登录后为DI配置接口,但我不确定这样做是否正确

我看了一些工厂,但没法去上班

我选择的DI可能是AutoFac/Ninject,项目是Xamarin移动应用程序

在实际场景中,基类上的令牌参数被解析 用户登录后

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

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

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.
     }
}
在中,您必须为此
ITokenProvider
创建一个实现。此实现的外观在很大程度上取决于您希望如何存储此令牌,但这里有一个可能的实现:

public sealed class AspNetSessionTokenProvider : ITokenProvider {
    public string GetCurrentToken() {
        return (string)HttpContext.Current.Session["token"];
    }
}
从那以后我就开始了。