加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Autofac:注册Async Factory方法

发布时间:2020-12-15 20:56:33 所属栏目:百科 来源:网络整理
导读:TL; DR:Autofac是否支持AutoFixture的fixture.Get()机制? 我正在使用Autofac,需要调用异步工厂方法,如下所示: class AppModel{ public static async TaskAppModel CreateAsync(IDependency x,IDependency2 y) { ... }} 我最简单的方法是执行这样的方法并
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中的正确解决方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读