在控制器中使用Repository方法(ASP.NET Core)

时间:2018-02-22 13:11:57

标签: c# asp.net-mvc

我使用存储库方法从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

我如何解决?

2 个答案:

答案 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。编译器找不到不带任何参数的构造函数,从而产生编译器错误。