如何将运行时字符串参数添加到依赖项解析链中?
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"];
}
}
如何为这种设置设置我选择的 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"];
}
}