编程语言
首页 > 编程语言> > c# – Autofac:注册Async Factory方法

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