.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 应用程序失败