我使用存储库方法从DB获取所有数据。
以下是代码:
public class ExperienceRepository
{
private readonly ToSeeDatabaseContext _context;
public ExperienceRepository(ToSeeDatabaseContext context)
{
_context = context;
}
public List<Experience> GetAllExperiences()
{
return _context.Experience.ToList();
}
}
我需要从控制器调用GetAllExperience
。
所以首先我需要将repo声明为私有属性
我这样做
private ExperienceRepository _exprepo = new ExperienceRepository();
但它说,它需要
严重级代码描述项目文件行抑制状态 错误CS7036没有给出对应于所需形式参数&#39; context&#39; &#39; ExperienceRepository.ExperienceRepository(ToSeeDatabaseContext)&#39; TooSeeWeb C:\ Users \ EugeneSukhomlyn \ source \ Workspaces \ TooSee \ Too See Web \ Too See Web \ Too See Web \ Controllers \ ExperienceController.cs 14 Active
我如何解决?
答案 0 :(得分:1)
由于您正在使用依赖项注入,因此首选方法是将DB上下文注入存储库。
您可能已经在ConfigureServices
文件的Startup.cs
方法中(或者如果您不使用ASP.NET Core,在配置服务集合的位置)设置了与此类似的代码up依赖注入的上下文(如果你不这样做,你应该添加它):
services.AddDbContext<ToSeeDatabaseContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("ToSeeDatabaseContext")));
由于您的体验库已经接受ToSeeDatabaseContext
,因此已经为依赖注入做好了准备。现在您必须通知DI框架ExperienceRepository
,以便它可以将其注入其消费者。所以在ConfigureServices
中添加:
services.AddTransient<ExperienceRepository, ExperienceRepository>();
现在可以在需要存储库时使用依赖注入。在您的使用者(例如,ASP.NET页面)中,您可以使用构造函数注入来获取存储库:
class MyExperienceConsumer {
private ExperienceRepository _exprepo;
public MyExperienceConsumer(ExperienceRepository exprepo) {
_exprepo = exprepo;
}
}
如果您的使用者是ASP.NET页面控制器,那么您只需要这样做,因为MVC框架将为您创建控制器并使用DI为您提供存储库。如果您需要自己实例化消费者,您需要通过DI框架中的服务提供商帮助实现,以便它可以发挥其魔力(假设您有一个服务集合)。当您使用ActivatorUtilities
时,DI框架会将存储库注入构造函数:
IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
MyExperienceConsumer consumer =
ActivatorUtilities.CreateInstance<MyExperienceConsumer>(serviceProvider);
在任何情况下,您都可以使用DI框架为您做繁重的工作。
答案 1 :(得分:0)
您的ExperienceRepository
类有一个构造函数需要ToSeeDatabaseContext
作为参数。
您正在尝试创建没有参数的实例ExperienceRepository
。编译器找不到不带任何参数的构造函数,从而产生编译器错误。