我有以下控制器类;
assert("Test 1", onlyOne(false, 0, "") === false);
assert("Test 2", onlyOne(false, 0, "x") === true);
assert("Test 3", onlyOne(false, 1, "") === true);
assert("Test 4", onlyOne(false, 1, "x") === false);
assert("Test 5", onlyOne(true, 0, "") === true);
assert("Test 6", onlyOne(true, 0, "x") === false);
assert("Test 7", onlyOne(true, 1, "") === false);
assert("Test 8", onlyOne(true, 1, "x") === false);
function onlyOne(a, b, c) {
const array = [a, b, c];
const count = loop(0, 0);
return count === 1;
function loop(count, i) {
return i < 3 ?
loop(array[i] ? count + 1 : count, i + 1) :
count; // return final state of the loop
}
}
function assert(test, condition) {
console.log(test, condition ? "passed" : "failed");
}
我想创建一个这个Class的实例并调用方法MyMethod(),例如。
public class MyController: Controller
{
private IValueService _service;
public MyController(IValueService service)
{
this._service = service;
}
public void MyMethod()
{
var values = _service.GetAll();
}
}
然而,我收到消息,我需要提供所需的服务参数。我如何创建一个具有服务(存储库)的控制器实例,以便我可以调用它的方法?
答案 0 :(得分:5)
在启动文件中添加:
services.AddMvc().AddControllersAsServices();
它将使用DI容器注册应用程序中的所有控制器。
然后:
var serviceProvider = HttpContext.RequestServices;
var controller =(MyController)serviceProvider.GetRequiredService<MyController>();
controller.Method();
答案 1 :(得分:4)
好吧,在启动时我想在使用存储库的类中运行一个方法。此方法首先打开SocketIO连接,然后它应该使用存储库将新的传入数据保存到数据库。
然后,该逻辑不应该在控制器内部,而是在某种服务类型中,而不是在依赖注入容器中注册。控制器将响应特定路由的请求,但您的事情听起来像是应用程序中的一般初始化步骤,它在请求之外运行。所以不应该涉及控制器。
相反,您希望先提供一些服务:
public class MyInitializationService
{
private readonly IValueService _valueService;
public MyInitializationService(IValueService valueService)
{
_valueService = valueService;
}
public void Initialize()
{
var values = _valueService.GetAll();
// do something
}
}
然后,您在ConfigureServices
课程的Startup
方法中注册该课程:
services.AddTransient<MyInitializationService>();
然后,您可以将该类型注入Configure
方法并调用其Initialize
方法:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, MyInitializationService initializationService)
{
initializationService.Initialize();
// …
app.UseStaticFiles();
app.UseMvc();
}
应用程序启动时,有很多方法可以在运行时运行。在Configure
内调用它只是一种方式,根据您希望代码运行的时间(因为Configure
非常早地运行),这可能适合也可能不适合。另一个好方法是将回调注册到应用程序生命周期的ApplicationStarted
事件。我有一个answer over here,详细介绍了这一点。