将工厂注册为
Task<HttpClient>
使用
DelegateInjectionFactory
是的。那你就可以
await
在注入之后,在你控制的代码中。
public static IUnityContainer CompositionRoot()
{
var container = new Unity.UnityContainer();
container.RegisterType<Application>();
container.RegisterType<Task<HttpClient>>
(
new DelegateInjectionFactory
(
new Func<Task<HttpClient>>
(
async () => await Create()
)
)
);
return container;
}
public static async Task<HttpClient> Create()
{
await Task.Delay(1); //Simulate doing something asynchronous
return new HttpClient();
}
将接收注入的类的示例:
public class Example
{
protected readonly Task<HttpClient> _client; //Injected
public Example(Task<HttpClient> client)
{
_client = client;
}
public async Task<string> Run()
{
var result = await (await _client).GetAsync("http://www.StackOverflow.com");
var text = await result.Content.ReadAsStringAsync();
return text;
}
}
现在
Create()
将异步执行,但容器不等待执行(容器没有为此设置)。相反,它是由您自己的代码等待的,在使用它的类中,您可以控制它。
注意:虽然这个例子表明
可能的
,我可能不会在生产代码中这样做。更常见的是编写一个工厂类,给它一个异步方法,注入工厂类,然后等待类中的方法接收注入。