.NET Core 2 - 创建具有存储库的控制器类实例

时间:2018-02-05 23:52:20

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

我有以下控制器类;

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

然而,我收到消息,我需要提供所需的服务参数。我如何创建一个具有服务(存储库)的控制器实例,以便我可以调用它的方法?

2 个答案:

答案 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,详细介绍了这一点。