【问题标题】:Access Controller method from another Class MVC C#来自另一个类 MVC C# 的访问控制器方法
【发布时间】:2021-07-09 08:22:38
【问题描述】:

我有一个带有方法 foo() 的 HomeController。 现在我想从一个普通的 Class.cs 类中访问 HomeController 的方法 foo()。 我该怎么做?

提前致谢

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-core controller


    【解决方案1】:

    如果您使用的是 ASP.Net Core,则可以在 Startup.cs 文件中添加自定义类和控制器:

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<MyClass>();
            services.AddMvc().AddControllersAsServices();
            // ...
        }
    
        // ...
    }
    

    之后您可以将控制器注入到自定义类中:

    public class MyClass
    {
        public MyClass(MyController controller)
        {
           // ...
        }
    }
    

    然后你可以请求一个自定义类的实例(例如serviceProvider.GetService&lt;MyClass&gt;()),控制器将被注入到这个类中。

    【讨论】:

    • 去哪里 serviceProvider.GetService() ?在我的班级?这个 public MyClass(MyController controller) { // ... } 是构造函数吗?
    • 例如来自主方法中 Program 类中的主机 (var host = CreateHostBuilder(args).Build(); var cl = host.Services.GetService&lt;MyClass&gt;();)。最好的情况是,如果需要 MyClass 的类也是使用依赖注入创建的,那么可以将该类注入到构造函数中。
    • public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } 公共静态 IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); });这是我的程序类,我应该在哪里添加 serviceProvider.GetService()?
    【解决方案2】:

    如果您需要从另一个控制器返回视图,则必须使用 Redirect 方法之一。

    如果您需要重用某些代码,最简单的方法是创建另一个类,例如 Common 并将 metod foo 放在那里,最好是静态的。

    public class Common
    {
    public static void Foo() {}
    }
    

    在此之后,您可以在代码中的任何位置、任何控制器的任何操作中使用它

    public classs HomeController:Controller
    {
       public IActionResult MyAction()
       {
               Common.Foo();
              .....other code
             return View();
        }
    }
    

    PS。我认为创建和注入整个控制器或类以仅使用其中一种方法并不是一个好主意。

    Ps2。如果 Foo 代码包含一些与 dbContext 一起使用的代码,最好创建一个存储库并将代码放在那里。

    【讨论】:

      【解决方案3】:

      通常我们会把方法放到一个服务中,并在startup.cs中注册。然后使用DI获取服务。然后调用服务中的方法。如果你想调用控制器中的方法。你也可以直接这样做:

      家庭控制器:

      public class HomeController : Controller
          {
              
      
              public HomeController()
              {
              }
              public string foo()
              {
                  return "Calling foo!";
              }
          }
      

      我的班级:

      public class MyClass
          {
              public string callFoo()
              {
                  HomeController h = new HomeController();
                  return h.foo();
              }
          }
      

      测试操作:

      public void Index()
      {
          MyClass n = new MyClass();
          var s = n.callFoo();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-11
        • 2020-06-04
        • 1970-01-01
        • 2015-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-19
        相关资源
        最近更新 更多