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