无法将Lambda表达式转为'InjectionMember[]',MVC中如何使用依赖注入?
解决MVC中依赖注入Lambda表达式无法转换为
InjectionMember[]的错误 问题背景
我之前在ASP.NET Core应用中编写了这段依赖注入代码,运行完全符合预期:
services.AddScoped<IDeviceRepository<Device>>(factory => { return new DeviceRepository<Device>( new AzureTableSettings( storageAccount: Configuration.GetConnectionString("Table_StorageAccount"), storageKey: Configuration.GetConnectionString("Table_StorageKey"), tableName: Configuration.GetConnectionString("Table_TableName") ) ); });
但把这段代码搬到传统ASP.NET MVC项目中使用时,却收到了错误提示:
无法将Lambda表达式转换为类型‘InjectionMember[]’,因为它不是委托类型
原因分析
这是因为ASP.NET Core内置的DI容器和**传统ASP.NET MVC常用的DI容器(比如Unity)**的API设计差异导致的:
- 在ASP.NET Core中,
IServiceCollection的AddScoped方法提供了直接接受Func<IServiceProvider, TService>类型参数的重载,所以你可以直接传入Lambda表达式作为实例工厂。 - 而传统ASP.NET MVC项目通常使用第三方容器(比如Unity),这类容器的注册方法(比如
RegisterType)要求传入InjectionMember类型的参数,直接传Lambda表达式无法被容器识别,因此会抛出类型转换错误。
解决方法
如果你的MVC项目使用的是Unity容器,只需要用InjectionFactory把你的Lambda表达式包装起来,将其转换为容器能识别的InjectionMember类型即可:
// 假设container是你的Unity容器实例 container.RegisterType<IDeviceRepository<Device>, DeviceRepository<Device>>( new InjectionFactory(factory => new DeviceRepository<Device>( new AzureTableSettings( storageAccount: Configuration.GetConnectionString("Table_StorageAccount"), storageKey: Configuration.GetConnectionString("Table_StorageKey"), tableName: Configuration.GetConnectionString("Table_TableName") ) ) ) );
如果你的MVC项目使用的是其他第三方DI容器(比如Autofac),思路是类似的:需要使用容器提供的特定API来注册工厂方法,而不是直接传入Lambda。例如Autofac中可以用Register方法结合工厂函数来实现相同的效果。
内容的提问来源于stack exchange,提问作者kudlatiger
相关产品推荐
相关产品推荐

