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

phi*_*con 3 .net asp.net asp.net-core asp.net-core-2.0

我有以下控制器类;

public class MyController: Controller
{
    private IValueService _service;

    public MyController(IValueService service)
    {
        this._service = service;
    }

    public void MyMethod()
    {
        var values = _service.GetAll();
    }
}
Run Code Online (Sandbox Code Playgroud)

我想创建这个类的实例并调用方法MyMethod(),例如

var MyCopy = new MyController();
MyCopy.MyMethod();
Run Code Online (Sandbox Code Playgroud)

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

pok*_*oke 5

好吧,在启动时,我想在使用存储库的类中运行方法。此方法首先打开SocketIO连接,然后应使用存储库将新的传入数据保存到数据库。

然后,该逻辑不应在控制器内部,而应在某种服务类型中,而应在依赖项注入容器中注册。控制器将在某些路由上响应请求,但是您的情况听起来像是应用程序中在请求之外运行的常规初始化步骤。因此,不应涉及任何控制器。

相反,您想先进行一些服务:

public class MyInitializationService
{
    private readonly IValueService _valueService;

    public MyInitializationService(IValueService valueService)
    {
        _valueService = valueService;
    }

    public void Initialize()
    {
        var values = _valueService.GetAll();
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在ConfigureServices您的Startup班级方法中注册该班级:

services.AddTransient<MyInitializationService>();
Run Code Online (Sandbox Code Playgroud)

然后,您可以将该类型注入Configure方法并调用其Initialize方法:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, MyInitializationService initializationService)
{
    initializationService.Initialize();

    // …
    app.UseStaticFiles();
    app.UseMvc();
}
Run Code Online (Sandbox Code Playgroud)

在应用程序启动时,有多种方法可以在开始时运行某些内容。在内部调用它Configure只是一种方法,根据您希望代码运行多早(因为Configure运行得很早),它可能合适也可能不合适。另一个好的方法是为ApplicationStarted应用程序生存期的事件注册一个回调。我在这里有一个答案,其中有更多详细信息。


小智 5

在启动文件中添加:

 services.AddMvc().AddControllersAsServices();  
Run Code Online (Sandbox Code Playgroud)

它将使用DI容器注册应用程序中的所有控制器.

然后 :

   var serviceProvider = HttpContext.RequestServices;
     var controller =(MyController)serviceProvider.GetRequiredService<MyController>();
     controller.Method();
Run Code Online (Sandbox Code Playgroud)