代码之家  ›  专栏  ›  技术社区  ›  Ian Warburton

使用异步注入工厂

  •  0
  • Ian Warburton  · 技术社区  · 6 年前

    我想在unity注入工厂中调用异步函数,就像这样…

    Container.RegisterType<HttpClient>(new InjectionFactory(
                    async c => await Create()));
    

    …但上面说…

    错误CS4010:无法将异步lambda表达式转换为委托类型 “功能”。异步lambda表达式可能返回 无效,任务或任务,其中任何一个都不能转换为 “功能”。

    有办法解决这个问题吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   John Wu    6 年前

    将工厂注册为 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() 将异步执行,但容器不等待执行(容器没有为此设置)。相反,它是由您自己的代码等待的,在使用它的类中,您可以控制它。

    注意:虽然这个例子表明 可能的 ,我可能不会在生产代码中这样做。更常见的是编写一个工厂类,给它一个异步方法,注入工厂类,然后等待类中的方法接收注入。