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, T>(Func<T1, T2, Task<T>> func)
{
return func(_container.Resolve<T1>(), _container.Resolve<T2>());
}
public static Task<T> ResolveAsync<T1, T2, T3, T>(Func<T1, T2, T3, Task<T>> func)
{
return func(_container.Resolve<T1>(), _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中的正确解决方案.
标签:c,asynchronous,dependency-injection,autofac,factory-method 来源: https://codeday.me/bug/20190711/1432994.html