c# - Autofac:注册异步工厂方法

标签 c# asynchronous dependency-injection autofac factory-method

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 autofaccery>表示与 ContainerBuilder 交互的某种机制和/或 IContainer和/或某种形式的 generated Delegates或类似的,本质上是简洁的,并且使我无法明确指定工厂方法的参数。即,我想避免像 atm 那样必须显式解析每个参数 [和/或必须在依赖项发生变化时更新它们]:

var appModel = await AppModel.CreateAsync( 
    container.Resolve<IDependency>(),
    container.Resolve<IDependency2>());

我在基础设施组件领域,靠近组合根并且可能以编程方式定义组件注册和/或做其他应该限制在那里的肮脏事情。我不介意涉及反射,因为它只被调用一次。

关键是我确实需要任何 Exception s 源自 Task有待观察。

Task<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# - Autofac:注册异步工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33524706/

相关文章:

c# - 如何在 WPF 应用程序中获取 Windows 任务栏高度?

c# - 确定字典是否包含一组键的全部

c# - 分块到 ASP.Net Web API 的多个异步文件上传

design-patterns - 如何使用依赖注入(inject)和存储库处理工作单元

c# - 在 C# 中读取大日志文件

c# - ASP.NET MVC 2 中具有一个名称的多个 Controller

c# - 为什么 Task<TResult>.Result 在这种情况下不起作用?

asynchronous - 如何让fluent-ffmpeg在执行下一行代码之前完成渲染?

c# - 如何订阅依赖注入(inject)服务的事件

c# - Autofac:如何在依赖于另一个对象函数输出的类上使用构造注入(inject)