2015-08-16 50 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)。 –