【问题标题】:When controller call method from another class produce produce invalid operation当来自另一个类的控制器调用方法产生无效操作时
【发布时间】:2019-10-16 01:16:32
【问题描述】:

从控制器调用方法会产生错误 InvalidOperationException: Unable to resolve service for type '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);
     }
 }

【问题讨论】:

标签: asp.net-core asp.net-core-webapi


【解决方案1】:

如需明确的解决方案,请在Startup.cs 中注册Season 喜欢

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>();           
    }
}

【讨论】:

    【解决方案2】:

    问题是您没有在 DI 容器中注册您的 Season 类,因此当在该控制器中收到请求时,没有人知道如何实例化 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 容器中注册它,然后在 TabsControllerSeasonController 中重新使用它。

    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 Container 中。

    您可以在此处阅读有关此设计模式/架构方法的更多信息:MVCS - Model View Controller Service

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多