c# – Autofac:注册Async Factory方法
TL; DR:Autofac是否支持AutoFixture的fixture.Get()机制?
我正在使用Autofac,需要调用异步工厂方法,如下所示: class AppModel { public static async Task<AppModel> CreateAsync(IDependency x,IDependency2 y) { ... } } 我最简单的方法是执行这样的方法并让参数由Autofac提供?即,我希望能够做到这样的事情: Task<AppModel> creationTask = <some autofaccery>(AppModel.CreateAsync); var appModel = await creationTask(); 其中< some autacaccery>表示与ContainerBuilder和/或IContainer和/或某种形式的generated Delegates或类似物相互作用的一些机制,它本质上是简洁的,并使我无法明确指定工厂方法的参数.即,我想避免必须显式解决每个参数[和/或必须更新它们作为依赖项更改],就像我做atm: var appModel = await AppModel.CreateAsync( container.Resolve<IDependency>(),container.Resolve<IDependency2>()); 我在基础架构组件领域,靠近组合根,并且可能以编程方式定义组件注册和/或做其他应该限制在那里的肮脏.我不介意反思,因为它只被调用一次. 重要的是我确实需要从任务中发现任何例外情况. 任务< T>在很大程度上是一个红色鲱鱼,但关键是遵循定义同步工厂方法的正常模式并且通过Autofac工作将不会飞(至少不是直接),即我不能只是将它改为: public static AppModel CreateAsync(IDependency x,IDependency2 y) { ... } 我还想避免两阶段初始化 – 我不需要该对象在初始化之前可用. 解决方法
(灵感来自TL; DR我在顶部添加)
您可以实现ResolveAsync方法系列: – public static Task<T> ResolveAsync<T1,T>(Func<T1,Task<T>> func) { return func(_container.Resolve<T1>()); } public static Task<T> ResolveAsync<T1,T2,Task<T>> func) { return func(_container.Resolve<T1>(),_container.Resolve<T2>()); } public static Task<T> ResolveAsync<T1,T3,_container.Resolve<T2>(),_container.Resolve<T3>()); } 这允许我这样做: var appModel = await ResolveAsync<IDependency,IDependency2>(AppModel.CreateAsync); 或者显然这些可以转化为扩展方法: – var appModel = await container.ResolveAsync<IDependency,IDependency2>(AppModel.CreateAsync); 在一个包装器上工作,允许使用C#的原始类型推理:(我将节省我的精力,而不是再花费更多时间来实现language/async paradigm not built for the job中的正确解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |