使用接口时没有触发方法[复制]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用接口时没有触发方法[复制]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我正在使用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);
}
}
答案
首先,你的班级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));
}
}
另一答案
看起来你的_newsarticleProvider没有实例化。
检查配置以确保正确设置依赖项注入。如果您不使用DI,请确保在控制器的构造函数中实例化您的提供程序。
以上是关于使用接口时没有触发方法[复制]的主要内容,如果未能解决你的问题,请参考以下文章
Promise then() 方法没有按预期触发? [复制]