使用Interface时未触发方法

时间:2018-02-28 07:26:42

标签: c# asp.net interface redis

我正在使用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);              
     }
 }

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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));  
         }
     }