Зарегистрируйте фабрику как 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()
будет выполняться асинхронно, но его не ждет контейнер (который не настроен для этого). Вместо этого его ждет ваш собственный код в классе, который его потребляет, который вы контролируете.
Примечание. Хотя этот пример демонстрирует, что он возможен , я бы вероятно, не делать этого в производственном коде. Чаще всего писать заводский класс, давать ему метод асинхронного ввода, вводить заводский класс и ждать метода в классе, получающем инъекцию.