c# - 将可运行脚本添加到 ASP.NET Core 应用程序

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

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

基本上,我希望能够运行类似 dotnet run foo 的程序,它会在服务器上执行一些同步代码,而不是启动普通的 kestrel 服务器。

最佳答案

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

  • ASP.NET Core 应用程序,以及
  • 包含您的可执行脚本的 .NET Core 控制台应用程序,以及
  • 一个 .NET 类库,其中包含两者的共同依赖项和服务集合配置,以便您可以在脚本中使用 ASP.NET DI 容器

从单项目 ASP.NET Core 应用程序到上述配置的步骤(假设您使用的是 Visual Studio)类似于:

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

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

    (您将不得不再次添加引用。)

  6. 您现在可以使用 Scripts 项目中的 DI 系统来获取类的实例,例如编写var widgetFactory = provider.GetService<IWidgetFactory>() .

您可以通过运行 dotnet run 来构建和运行您的脚本从你的文件夹中 Scripts项目。

如果你想要多个可执行脚本,只需添加一个switch对您的声明 Main根据 args[0] 的值执行不同操作的方法, 然后用 dotnet run wibble 调用你的脚本, dotnet run wobble

关于c# - 将可运行脚本添加到 ASP.NET Core 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41232344/

相关文章:

c# - 为什么 Lazy<T> 受限于静态上下文?

java - 术语非原始类型和对象类型有什么区别?

c# - 结果类型 'System.Tuple` 3[System.Guid,System.Int32,System.String]' 可能不是抽象的,必须包含默认构造函数

javascript - jQuery .val() 没有选取innerText 的值

c# - 模型绑定(bind)不适用于 int 数组

asp.net-mvc - Ninject DI 导致部署问题

c# - 找不到存储过程 'dbo.aspnet_UsersInRoles_GetRolesForUser'

asp.net - IIS7.0中如何使静态Html页面通过HttpModule?

c# - Entity Framework 工作单元生命周期

c# - 检查动态创建的文本框是否被 Javascript 弄脏