使用接口时没有触发方法[复制]

问题描述 投票:1回答:2

这个问题在这里已有答案:

我正在使用Asp.net web api和调用另一个正常工作的类库的方法。为了实现Redis缓存,我改为class to interface。在这种情况下,不会触发类库中的方法。我收到以下错误“对象引用未设置为对象的实例。”,“ExceptionType”:“System.NullReferenceException”,“StackTrace”

public class ArticleListingController : ApiController
    {
        public IArticleProvider _newsarticleProvider { get; set; }
        [HttpGet]
        [Route("Listing")]
        public IHttpActionResult GetArticlesListing(string sectionName, int RegionId, int Count)
        {
            List<Article> articleList = new List<Article>();
            if (!string.IsNullOrEmpty(RegionId.ToString()))
            {
                if (articleList != null)
                {
                    articleList = _newsarticleProvider.GetArticleListBySectionName(sectionName, RegionId, Count, ListingArticleCache);
                    return Ok(articleList);
                }
            }
            return NotFound();
        }
}

在提供者接口代码中

public interface IArticleProvider
{
        List<Article> GetArticleListBySectionName(string sectionName, int RegionId, int Count, int CacheTime);
 }

在提供者代码中

public class ArticleProvider 
    {

    public List<Article> GetArticleListBySectionName(string sectionName, int RegionId, int Count, int CacheTime)
    {return _articleRepositary.GetArticleListBySectionName(sectionName, RegionId, Count, CacheTime);              
     }
 }
c# asp.net interface redis
2个回答
1
投票

首先,你的班级ArticleProvider没有实现你的界面IArticleProvider。然后,您需要创建一个类型为ArticleProvider的实例,其引用类型为IArticleProvider。

IArticleProvider _newsarticleProvider = new ArticleProvider();

假设您使用某种DI容器。如果您这样做,则需要注册您的提供商。根据您使用的容器,语法可能会有所不同。如果您使用DI解析程序注册了提供程序,则不再需要创建已解析类型的实例,并且可以在整个应用程序中使用它。只需使用类构造函数注入它:

    public class ArticleListingController : ApiController
    {
         private readonly IArticleProvider _newsarticleProvider;
         public ArticleListingController(IArticleProvider newsarticleProvider)
         {
             _newsarticleProvider = newsarticleProvider ?? throw new ArgumentNullException(nameof(newsarticleProvider));  
         }
     }

1
投票

看起来你的_newsarticleProvider没有实例化。

检查配置以确保正确设置依赖项注入。如果您不使用DI,请确保在控制器的构造函数中实例化您的提供程序。

© www.soinside.com 2019 - 2024. All rights reserved.