2015-12-10 34 views
0

我是新來的簡單噴油器。我有依賴於強制客戶端的數據訪問層。我已經註冊了ForceClient依賴項。一旦用戶登錄到應用程序,我想要替換默認值ForceClient如何使用簡單的噴油器在運行時改變依賴關係

請讓我知道,我如何在運行時更改默認值。

Ioc.ServiceContainer.Register(() => new ForceClient(
    "test", 
    "test", 
    "test")); 

這是關於要求的完整細節。我在我們的Xamarin項目中使用了DAL,可以使用Developerforce.Force API從銷售人員那裏檢索數據。我正在使用MOQ編寫單元測試用例來測試DAL。

DAL代碼。

public CustomerRepository(IForceClient client) 
{ 
    _client = client;      
} 

public async Task<long> GetTotalContacts() 
{ 
    string totalContactCountQry = "some query" 

    var customerCount = await _client.QueryAsync<ContactsTotal>(totalContactCountQry); 
    var firstOrDefault = customerCount.Records.FirstOrDefault(); 

    return firstOrDefault != null ? firstOrDefault.Total : 0; 
} 

單元測試用例代碼。在應用程序初始化

container.Register<IForceClient>((() => new ForceClient(
    UserState.Current.ApiBaseUrl, 
    UserState.Current.AuthToken.AccessToken, 
    UserState.Current.ApiVersion)), Lifestyle.Transient); 

ForceClient的註冊過程中,我創建實例

[SetUp] 
public void Init() 
{ 
    forceClientMock = new Mock<IForceClient>(); 
    forceClientMock.Setup(x => x.ForceClient(It.IsAny<string>(), 
     It.IsAny<string>(), It.IsAny<string>(), It.IsAny<HttpClient>())) 
     .Return(new ForceClient(It.IsAny<string>(), It.IsAny<string>(), 
      It.IsAny<string>(), It.IsAny<HttpClient>()));    
    forceClientMock.Setup(x => x.QueryAsync<ContactsTotal>(It.IsAny<string>())) 
     .ReturnsAsync(new QueryResult<ContactsTotal>()); 
    forceClientMock.Setup(x => x.QueryAsync<ContactsTotal>(It.IsAny<string>())) 
     .ReturnsAsync(new QueryResult<ContactsTotal>() { Records=new List<ContactsTotal>() });    
} 

[Test] 
public void GetTotalContacts() 
{    
    ICustomerRepository customerRepostory = new CustomerRepository(forceClientMock.Object); 
    Assert.AreEqual(customerRepostory.GetTotalContacts().Result,0); 
} 

簡單的噴油器註冊使用全部默認值UserState的創建。一旦用戶登錄到應用程序,實際值就會被分配。

我除了ForceClient例如有登錄後更新的值來訪問銷售隊伍來檢索數據,但該方案是給下面一行DAL錯誤

var customerCount = await _client.QueryAsync<ContactsTotal>(totalContactCountQry); 

的原因是forceClient還包含默認值。我如何確保在登錄後創建FoceClient實例以使用UserState的實際值

+0

我不知道我理解你試着做什麼和什麼你的問題是。您的委託註冊已經允許ForceClient被'替換',因爲每個解決方案(瞬態)都會注入一個新實例。 – Steven

+0

我與container.Register嘗試這((()=>新ForceClient( UserState.Current.ApiBaseUrl, UserState.Current.AuthToken.AccessToken, UserState.Current.ApiVersion)),Lifestyle.Transient) ; – Rajalbar

+0

它不會在運行時更新ForceClient實例。我正在註冊對應用程序初始化的依賴。在應用程序初始化時,UserState.Current對象具有默認值,一旦用戶登錄到應用程序,這些值將取代實際用戶登錄詳細信息。 – Rajalbar

回答

0

您可以使用Func<T>完成您想要的操作。

,而不是你的CLASSE IForceClient,你可以注入一個Func<IForceClient>

public CustomerRepository(Func<IForceClient> clientFunc) 
{ 
    _clientFunc = clientFunc; 
} 

public async Task<long> GetTotalContacts() 
{ 
    string totalContactCountQry = "some query" 

    // calling _clientFunc() will provide you a new instance of IForceClient 
    var customerCount = await _clientFunc().QueryAsync<ContactsTotal>(totalContactCountQry); 
    var firstOrDefault = customerCount.Records.FirstOrDefault(); 

    return firstOrDefault != null ? firstOrDefault.Total : 0; 
} 

簡單的注射器登記:

// Your function 
Func<IForceClient> fonceClientFunc =() => new ForceClient(
    UserState.Current.ApiBaseUrl, 
    UserState.Current.AuthToken.AccessToken, 
    UserState.Current.ApiVersion); 

// the registration 
container.Register<Func<IForceClient>>(() => fonceClientFunc, Lifestyle.Transient); 
相關問題