MVC核心依赖注入:接口 - 存储库通用参数错误

时间:2018-05-29 23:59:47

标签: c# asp.net-mvc asp.net-core dependency-injection repository

我已经阅读了很多关于stackoverflow的书籍和文章。 仍然收到以下错误。这是我使用Generic Parameter的Interface,Repository的基本概要。我的Startup.cs中有AddTransient。

在控制器中,我试图引用接口,而不是引用存储库名称。我有没有通用参数的东西。一旦我实现了通用参数,我就会收到以下错误。我想在不参考Repository或Model的情况下引用Interface,因为我们可能会在稍后从RelationalDB转到MongoDB,等等。我如何摆脱这个错误?

接口

public interface IProductRepository<T>: IDisposable where T:class
{
    IEnumerable<T> GetProductDetail();

存储库:

public class ProductRepository: IProductRepository<ProductdbData>
{
     IEnumerable<ProductdbData> GetProductDetail(); 

Startup.cs

services.AddTransient(typeof(IProductRepository<>), typeof(ProductRepository));

控制器网页错误:

namespace CompanyWeb.Controllers
{
    public class ProductController: Controller
    {
        private IProductRepository _productwebrepository; // this line gives error

错误消息: 错误CS0305使用泛型类型&#39; IProductRepository&#39;需要1个类型参数

1 个答案:

答案 0 :(得分:0)

错误消息

错误消息告诉您确切的问题所在。缺少类型参数。只需添加它:) 此外,提供的错误代码CS0305是谷歌搜索/ binging的理想选择。

docs.microsoft.com声明如下:

  

当找不到预期数量的类型参数时,会发生此错误。要解析C0305,请使用所需数量的类型参数。

可能的解决方案

有多种方法可以解决问题。

1。删除通用参数

如果您计划仅提供一种产品类型,则完全跳过通用参数,错误将消失。此外,您还可以消除不必要的复杂性。

Interace

public interface IProductRepository: IDisposable
{
    IEnumerable<ProductdbData> GetProductDetail();

Startup.cs

services.AddTransient<IProductRepository, ProductRepository>();

控制器:

namespace CompanyWeb.Controllers
{
    [Route("api/[controller]")]
    public class ProductController : Controller
    {
        private IProductRepository _ProductRepository;

        public ProductController(IProductRepository productRepository)
        {
            _ProductRepository = productRepository;
        }

2。保持通用参数

如果你决定坚持使用泛型参数,你实际上必须修复控制器和接口,并在两个地方传递你的泛型类型参数。

Startup.cs

services.AddTransient<IProductRepository<ProductdbData>, ProductRepository>();

控制器:

namespace CompanyWeb.Controllers
{
    [Route("api/[controller]")]
    public class ProductController : Controller
    {
        private IProductRepository<ProductdbData> _ProductRepository;

        public ProductController(IProductRepository<ProductdbData> productRepository)
        {
            _ProductRepository = productRepository;
        }