如何在.NET Core 2.2中注册通用接口

3
我正在尝试创建一个新的.NET Core API,其中包含通用的存储库和服务,每个类型都有其自己的接口和相应的实现。我创建了一个通用的存储库和服务结构,但是我似乎无法正确地在startup.cs中进行注册,或者我做错了其他事情。任何帮助都将不胜感激!
我有一个名为IRepository<T>的通用存储库,已正确注册,在我的控制器中,这个存储库按预期工作。
我有一个名为UserService的服务,它从Service<T, IUserrepository>继承。 Service<T, R>实现IService<T, R>,其中T是类型,R是IRepository<T>
services.AddScoped(typeof(IUserService), typeof(UserService));

会创建以下错误:

InvalidCastException:无法将类型为API.Services.UserService的对象转换为类型API.Interfaces.IUserService。

services.AddScoped(typeof(IService<User, IRepository<User>>), typeof(UserService));

产生以下错误:

InvalidOperationException:尝试激活API.Controllers.UserController时,无法解析类型为API.Interfaces.IUserService的服务。

IService

    public interface IService<T, R>
    where T : BaseEntity
    where R : IRepository<T>
    {}

用户服务接口

    public interface IUserService : IService<User, IUserRepository> {}

用户服务

    public UserService(
        IRepository<User> userRepository,
        IOptions<AppSettings> appSettings)
        : base(userRepository, appSettings)
        {}

基础控制器

    public class BaseController<T, Y, Z> : ControllerBase
    where T : BaseEntity
    where Y : IService<T, Z>
    where Z : IRepository<T>
    {
        public readonly IRepository<T> TypeRepository;
        public readonly IService<T, Z> TypeService;

        public BaseController(
            IRepository<T> injectedRepository,
            IService<T, Z> injectedService)
        {
            TypeRepository = injectedRepository;
            TypeService = injectedService as IService<T, Z>;
        }
    }

Startup.cs

    services.AddScoped(typeof(IUserService), typeof(UserService));

我在 Startup.cs 中尝试过的内容

    services.AddScoped(typeof(IService<User, IRepository<User>>), typeof(UserService));
    services.AddScoped(typeof(IService<User, IRepository<User>>), typeof(Service<User, IRepository<User>>));
    services.AddScoped<UserService>();
    services.AddScoped(typeof(IUserService), typeof(UserService));

完整的MRE可以在这里找到

我原以为注册将是正确的,因为没有错误提示,但当我运行解决方案并发送请求时,我遇到了上述错误的500个响应。请问有人能指出我做错了什么吗?很明显我对这里非常重要的东西有所误解。提前感谢!


1
你确定 UserService 实现了该接口吗?internal class UserService : IUserService - Silvermind
@Silvermind UserService类的实现如下: public class UserService : Service<User, IUserRepository> - user3661574
2
为什么 UserService 没有实现 IUserService 接口? - Vidmantas Blazevicius
尝试将该行更改为services.AddScoped(typeof(IService<User, IUserRepository), typeof(UserService));。 - Azhar Khorasany
@AzharKhorasany 谢谢!我尝试了,但是我得到了相同的错误InvalidOperationException: Unable to resolve service for type... - user3661574
显示剩余3条评论
1个回答

1

VidmantasSilvermind的评论指引我找到了正确的方向。

我移除了Service-类并在UserService中实现了IUserService

在我的startup.cs文件中,通过像这样注册接口及其实现来使它们正常工作: services.AddScoped(typeof(IUserService), typeof(UserService));

我被弄糊涂了,试图用一个解决方案来解决问题,结果导致了这个错误。感谢我的程序员同伴们一直在这里支持我!我爱你们!


1
当可以使用通用版本时,您应该使用它:services.AddScoped<IUserService, UserService>(); 这样会为您节省麻烦。它“强制”实现接口。 - Silvermind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接