如何在 .NET Core 2.2 中注册泛型接口



我正在尝试创建一个具有通用存储库和服务的新.NET CoreAPI,其中每种类型都有自己的接口与相应的实现。我创建了一个通用存储库和服务结构,但我似乎无法正确startup.cs注册,或者我做错了其他事情。任何帮助将不胜感激!

我有一个正确注册的通用存储库,称为:IRepository<T>在我的控制器中,此存储库按预期工作。

我有一个名为:UserService的服务,它继承自Service<T, IUserrepository>

Service<T, R>实现IService<T, R>其中 T 是类型,R 是IRepository<T>

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

创建以下错误:

无效转换异常:无法强制转换 API 类型的对象。服务.用户服务键入 API。Interfaces.IUserService.

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

创建以下错误:

无效操作异常:无法解析类型 API 的服务。Interfaces.IUserService,同时尝试激活API。控制器.用户控制器。

服务对象

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

IUserService

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>;
}
}

启动.cs

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

我在创业公司尝试过的事情.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。有人可以指出我做错了什么吗?我显然不明白这里非常重要的事情。提前感谢!

Vidmantas和Silvermind的评论为我指明了正确的方向。

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

在我的创业公司中.cs这一切都是通过向实现注册我的接口来工作的,如下所示:services.AddScoped(typeof(IUserService), typeof(UserService));

我被蒙蔽了,我试图用一个解决方案来解决问题,这反过来又导致了这个错误。谢谢你们在这里为我服务,我的程序员伙伴们!我爱你们!

最新更新