我是简单注射器的新手。我有依赖于Force Client的数据访问层。我已经注册了ForceClient
依赖项。我想替换ForceClient
一次用户登录到应用程序的默认值。
请让我知道,我如何在运行时更改默认值。
Ioc.ServiceContainer.Register(() => new ForceClient(
"test",
"test",
"test"));
这是有关要求的完整详细信息。我在Xamarin项目中拥有DAL,该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;
}
单元测试用例代码。
[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);
}
应用程序初始化时使用简单的Injector注册表
container.Register<IForceClient>((() => new ForceClient(
UserState.Current.ApiBaseUrl,
UserState.Current.AuthToken.AccessToken,
UserState.Current.ApiVersion)), Lifestyle.Transient);
我正在注册表中创建的ForceClient实例正在使用所有默认值UserState创建。用户登录到应用程序后,便会分配实际值。
除了ForceClient实例,我在登录后具有更新的值以访问销售人员以检索数据,但是该程序在DAL行下方给出了错误
var customerCount = await _client.QueryAsync<ContactsTotal>(totalContactCountQry);
原因是forceClient仍然包含默认值。我如何确保登录后创建FoceClient实例以使用UserState的实际值
您可以通过使用完成您想要的Func<T>
。
除了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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句