You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:47:05