我正在尝试创建一个具有通用存储库和服务的新.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));
我被蒙蔽了,我试图用一个解决方案来解决问题,这反过来又导致了这个错误。谢谢你们在这里为我服务,我的程序员伙伴们!我爱你们!