.NET 6 服务注册适用于具体类,但接口失败

Posted

技术标签:

【中文标题】.NET 6 服务注册适用于具体类,但接口失败【英文标题】:.NET 6 service registration works with concrete class but fails with interface 【发布时间】:2022-01-21 16:10:43 【问题描述】:

我有一个类 ArtistAccess 在 .NET 6 最小 WebApi 项目中实现此接口:

using DataAccess.Models;

namespace DataAccess.Repository

    public interface IArtistAccess
    
        Task<IEnumerable<Artist>> GetAllArtist();
        Task<int> Insert(Artist model);
    

如果我将该类注册为具体类,则该应用程序可以工作:

builder.Services.AddSingleton<ArtistAccess>();

如果我用这样的接口注册类:

builder.Services.AddSingleton<IArtistAccess, ArtistAccess>();

应用程序编译但在运行时立即失败并出现以下错误:

System.InvalidOperationException: '已推断出正文,但该方法不允许推断正文参数。 以下是我们找到的参数列表:

为什么服务注册在接口上不起作用?

【问题讨论】:

我遇到了同样的问题…… PS:我有其他应用程序可以像冠军一样添加带有接口的服务。 嗨@rp。 ,我已经在 asp.net 6 中测试了您的代码并且工作正常...您能否分享整个错误消息?你什么时候收到这个错误?应用运行时会出现在这一行(AddSingleton)? 这发生在哪里?这不是 DI 问题。发布完整的异常文本(即包括调用堆栈和任何内部异常)和引发异常的实际位置。另一方面,“通用存储库”反模式,尤其是单例生命周期,将导致更严重的问题。 您是否在您的MapGet 方法中将resolved 参数从ArtistAccess 更改为IArtistAccess 【参考方案1】:

哦。我在 Twitter 上@paul_shinn 发现了我的错误。如果服务注册为接口/类,那么路由方法需要引用接口,而不是类。

这样做

    private static async Task<IResult> GetAllArtist(IArtistAccess data)

而不是这个:

    private static async Task<IResult> GetAllArtist(ArtistAccess data)

【讨论】:

这正是我在关于已解析参数的评论中的意思。 嗨,罗杰,@paul_shinn。不要忘记检查你的构造函数!

以上是关于.NET 6 服务注册适用于具体类,但接口失败的主要内容,如果未能解决你的问题,请参考以下文章

使用系统 DBus 的 registerService 失败(但适用于会话 DBus)

.net 6 web api中使用Autofac依赖注入框架实现批量自动扫描程序集注册服务

两级嵌套 c++ 类适用于 GCC,但使用 Clang 失败

为 MQTTnet 客户端消息的 TLS/SSL 加密导入的 PFX 证书适用于服务,但适用于 Xamarin UWP 应用程序失败

C# 等效于 VB.NET 接口实现

asp.net core2 mvc 基础教程--服务注册和管道