2015-08-16 48 views
1

怎么可能设置我的选择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的移动应用

回答

2

在真实的情景,在基类中的令牌参数解析 后用户在已经登录。

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

通常有传递运行时数据的方法。您可以通过方法调用通过对象图的方法调用它,也可以通过组件调用返回正确值的方法。此令牌好像它是上下文信息,并且通常意味着你选择后者:

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"]; 
    } 
} 
+0

因为我有(HTTP [关于这一主题的Autofac文档站点添加了一个常见问题]:// autofac .readthedocs.org/EN /最新/ FAQ /注入·全球parameters.html)。 –