我尝试使用存储库模式从数据库中获取数据我有3个项目
Bmu.Mode'这是用于模型创建数据库的'
Bmu.Repo',它具有2个用于存储库的文件夹,包括contract / InewsRepository.cs和用于实现接口的'Repository / NewsRepository'
Bmu.Api用于从Repo项目中调用数据
模型项目中的新闻类
namespace bmu.model
{
public class News
{
public int Id { get; set; }
public string SubTitle { get; set; }
public string Title { get; set; }
public string Summery { get; set; }
}
}
模型项目中的上下文类
namespace bmu.model
{
public class BmuContext : DbContext
{
public BmuContext(DbContextOptions<BmuContext> options): base(options)
{
}
public DbSet<News> News { get; set; }
}
}
我在Repo项目中的界面
namespace bmu.repo.Contracts
{
public interface INewsRepository
{
Task<IEnumerable<News>> GetAllAsync();
Task<IEnumerable<News>> GetAllActiveAsync();
}
}
bmu.repo中的实现接口
namespace bmu.repo.IRepository
{
public class NewsRepository : INewsRepository
{
private readonly BmuContext _context;
private readonly MemoryCache _memoryCache;
public NewsRepository(BmuContext context, MemoryCache memoryCache)
{
_context = context;
_memoryCache = memoryCache;
}
public async Task<IEnumerable<News>> GetAllAsync()
{
return await _context.News.ToListAsync();
}
public async Task<IEnumerable<News>> GetAllActiveAsync()
{
return await _context.News.Where(x => x.Active).ToListAsync();
}
}
}
也添加
services.AddControllers();
services.AddSingleton<INewsRepository, NewsRepository>();
启动Api项目这是我的控制器
namespace bmu.api.Controllers
{
[ApiController]
[Route("[controller]")]
public class NewsController : ControllerBase
{
private readonly ILogger<NewsController> _logger;
private readonly INewsRepository _newsRepository;
public NewsController(ILogger<NewsController> logger,INewsRepository newsRepository)
{
_logger = logger;
_newsRepository = newsRepository;
}
[HttpGet]
public async Task<IEnumerable<News>> Get()
{
return await _newsRepository.GetAllActiveAsync();
}
}
}
但是在运行项目时出现此错误
AggregateException:无法构造某些服务(验证服务描述符'ServiceType:bmu.repo.Contracts.INewsRepository时出现错误:Singleton ImplementationType:bmu.repo.IRepository.NewsRepository':无法为类型'解析服务bmu.model.BmuContext”,同时尝试激活“ bmu.repo.IRepository.NewsRepository”。)
此错误有解决方案吗?
您的API中存在生命周期类型不匹配。 EntityFramework DbContext是一个范围服务,您不能拥有NewsRepository的单例实例,因为它取决于为每个请求生成的实例。