【发布时间】:2021-07-09 08:22:38
【问题描述】:
我有一个带有方法 foo() 的 HomeController。 现在我想从一个普通的 Class.cs 类中访问 HomeController 的方法 foo()。 我该怎么做?
提前致谢
【问题讨论】:
标签: c# asp.net asp.net-mvc asp.net-core controller
我有一个带有方法 foo() 的 HomeController。 现在我想从一个普通的 Class.cs 类中访问 HomeController 的方法 foo()。 我该怎么做?
提前致谢
【问题讨论】:
标签: c# asp.net asp.net-mvc asp.net-core controller
如果您使用的是 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<MyClass>()),控制器将被注入到这个类中。
【讨论】:
var host = CreateHostBuilder(args).Build(); var cl = host.Services.GetService<MyClass>();)。最好的情况是,如果需要 MyClass 的类也是使用依赖注入创建的,那么可以将该类注入到构造函数中。
如果您需要从另一个控制器返回视图,则必须使用 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 一起使用的代码,最好创建一个存储库并将代码放在那里。
【讨论】:
通常我们会把方法放到一个服务中,并在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();
}
【讨论】: