如何注册带有依赖项的Autofac Adapter适配器?
为什么没有无参数的RegisterAdapter重载
Autofac没有提供RegisterAdapter<From, To>()这类隐式适配的重载,核心原因是框架无法自动确定适配逻辑:无法推断From类型实例要传递给To构造函数的哪个参数,也无法处理To存在多个构造函数的歧义场景,为了避免隐式绑定导致的不可预期行为,官方只提供了显式指定适配逻辑的重载。
最优实现方案
你当前使用的传入TypedParameter调用Resolve的写法本身是符合Autofac设计规范的标准实现,觉得冗余的话可以自行封装扩展方法简化调用:
public static class AutofacAdapterExtensions { public static void RegisterAutoAdapter<TFrom, TTo>(this ContainerBuilder builder) { builder.RegisterAdapter<TFrom, TTo>((context, fromInstance) => context.Resolve<TTo>(new TypedParameter(typeof(TFrom), fromInstance))); } }
封装完成后即可直接使用预期的写法完成注册:
builder.RegisterAutoAdapter<ICommand, ToolbarButton>();
该方案完全复用Autofac的构造函数注入能力,不需要手动维护ToolbarButton的依赖项列表,新增或减少构造参数时无需修改适配注册代码。
如果是一次性的适配场景,不需要复用适配逻辑,也可以直接注册ToolbarButton的集合:
builder.Register<IEnumerable<ToolbarButton>>(ctx => ctx.Resolve<IEnumerable<ICommand>>() .Select(cmd => ctx.Resolve<ToolbarButton>(new TypedParameter(typeof(ICommand), cmd))) .ToList());
内容的提问来源于stack exchange,提问作者ladenedge
相关产品推荐
相关产品推荐

