При вызове метода контроллера из другого класса производят недопустимую операцию - PullRequest
0 голосов
/ 30 мая 2019

При вызове метода из контроллера возникает ошибка InvalidOperationException: невозможно разрешить службу для типа 'AwardManagement.Class.Season' при попытке активировать 'AwardManagement.Controllers.TabsController'.

Это код вызова из контроллера


   public TabsController(AwardContext context,Season seasons)
   {
       _context = context;
       _seasons = seasons;
   }
   public ActionResult GetTabs(int id)
   {
       var tabs =  _context.Tabs.Find(id);
       if (tabs == null)
       {
          return NotFound();
       }
       var season = _seasons.GetSingle(tabs.SeasonId);
       var result = new { tab = tabs, season = season };
       return  Ok(result);
   }

Определение GetSingle () в классе сезона

public class Season
{
     private readonly AwardContext _context;
     public Season(AwardContext context)
     {
        _context = context;
     } 
     public  Seasons GetSingle(int? id)
     {
        return _context.Seasons.FirstOrDefault(x => x.Id == id);
     }
 }

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Для ясного решения, зарегистрируйте Season в Startup.cs как

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {            
        services.AddScoped<Season>();           
    }
}
0 голосов
/ 30 мая 2019

Проблема в том, что вы не зарегистрировали свой класс Season в контейнере DI, поэтому при получении запроса в этом контроллере никто не знает, как создать экземпляр TabsController, потому что он не знает, откуда взятьSeason параметр.

Вы можете прочитать больше здесь: https://aspnetcore.readthedocs.io/en/stable/mvc/controllers/dependency-injection.html

Кроме этого есть два способа решить этот:

  1. Измените GetTabs для непосредственного использования _context.Seasons

       public TabsController(AwardContext context)
       {
           _context = context;
       }
       public ActionResult GetTabs(int id)
       {
           var tabs =  _context.Tabs.Find(id);
           if (tabs == null)
           {
              return NotFound();
           }
           var season = _context.Seasons.FirstOrDefault(tabs.SeasonId);
           var result = new { tab = tabs, season = season };
           return  Ok(result);
       }
    
  2. Или вы перемещаете логику в отдельный класс (например, службу): SeasonService, затем регистрируете это в DIконтейнер, затем вы снова используете его в TabsController и SeasonController.

SeasonService будет выглядеть примерно так:

public class SeasonService
{
     private readonly AwardContext _context;
     public SeasonService(AwardContext context)
     {
        _context = context;
     } 
     public  Seasons GetSingle(int? id)
     {
        return _context.Seasons.FirstOrDefault(x => x.Id == id);
     }
 }

И вам нужно зарегистрировать его в DI-контейнере: https://medium.com/volosoft/asp-net-core-dependency-injection-best-practices-tips-tricks-c6e9c67f9d96

А потомвы сможете использовать его внутри своих контроллеров:

   public TabsController(TabsService tabsService, SeasonService seasonService)
   {
       _tabsService = tabsService;
       _seasonService = seasonService;
   }
   public ActionResult GetTabs(int id)
   {
       var tabs =  _tabsService.FindById(id);
       if (tabs == null)
       {
          return NotFound();
       }
       var season = _seasonService.GetSingleById(tabs.SeasonId);
       var result = new { tab = tabs, season = season };
       return  Ok(result);
   }

Как видите, вам также необходимо создать TabsService и зарегистрировать его в DI-контейнере.

Вы можетеПодробнее об этом шаблоне проектирования / архитектурном подходе читайте здесь: MVCS - служба контроллера представления модели

...