将可运行脚本添加到ASP.NET核心应用程序

时间:2016-12-19 22:56:46

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

我目前有一个实现基本Web API的ASP.NET Core应用程序。我需要编写一个挂钩到相同环境中的脚本,至少可以访问数据库,但是找不到向应用程序添加新入口点的位置。我可以在Program.cs中的Main方法中轻松查看string[] args而不启动服务器,但我不知道如何加载环境并运行任意代码而不需要站起来正常的Kestrel服务器。我对.NET世界很陌生,所以我希望有一种简单的方法可以做到这一点,我在文档中找不到。

基本上我希望能够运行像dotnet run foo这样的东西,它会在服务器上执行一些同步代码,而不是启动正常的沙盒服务器。

1 个答案:

答案 0 :(得分:2)

您可以通过添加新项目来完成此操作。我们的想法是在您的解决方案中共存三个项目:

  • ASP.NET核心应用程序和
  • 包含可执行脚本的.NET Core Console应用程序,
  • 包含两者的公共依赖关系并包含服务集合配置的.NET类库,以便您可以在脚本中使用ASP.NET DI容器

从单项目ASP.NET Core应用程序到上面的配置(假设您使用的是Visual Studio)的步骤如下所示:

  1. 在解决方案资源管理器中右键单击您的解决方案,转到添加 - > New Project ... ,然后选择项目类型 Console App(.NET Core)。为其命名(例如 Scripts ),然后点击确定
  2. 添加另一个类型为类库(.NET Core)的项目,例如,名为通用
  3. 将要使用的任何类从ASP.NET Core项目迁移到 Common 项目。
  4. Common 项目中添加CommonStartup课程。给它一个public static void ConfigureServices(IServiceCollection services)并剪切并粘贴您希望与 Scripts 项目共享的ASP.NET核心应用程序的Startup.ConfigureServices方法中的任何服务配置。在ASP.NET Core项目中添加对CommonStartup.ConfigureServices(services)Startup.ConfigureServices方法的调用。 (您需要向 Common 项目添加对Microsoft.Extensions.DependencyInjection;Microsoft.Extensions.DependencyInjection.Abstractions;的引用,并向ASP.NET Core项目添加对 Common 的引用; Visual Studio应将这些视为侧边栏操作。
  5. 脚本项目的Main方法开始时,添加:

    var services = new ServiceCollection();
    CommonStartup.ConfigureServices(services);
    var provider = services.BuildServiceProvider();
    

    (您将再次添加引用。)

  6. 您现在可以使用 Scripts 项目中的DI系统来获取类的实例,例如var widgetFactory = provider.GetService<IWidgetFactory>()
  7. 您可以通过在dotnet run项目的文件夹中运行Scripts来构建和运行脚本。

    如果您需要多个可执行脚本,只需在switch方法中添加Main语句,根据args[0]的值执行不同的操作,然后使用{{1}调用脚本},dotnet run wibble