Dependency injection 如何将运行时字符串参数添加到依赖项解析链中?
如何为这种设置设置我选择的DI: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
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"];
}
}
从那以后我就开始了。