我目前有一个实现基本 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)类似于:
- 在解决方案资源管理器中右键单击您的解决方案,转到添加 -> 新建项目...,然后选择项目类型Console App (.NET核心)。为其命名(例如 Scripts)并单击OK。
- 添加另一个类型为 Class Library (.NET Core) 的项目,例如命名为常见。
- 将您要使用的任何类从 ASP.NET Core 项目迁移到Common 项目。
- 添加
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 应该将这些作为侧边栏操作提供。 在您的脚本 项目的
Main
开始处方法,添加:var services = new ServiceCollection(); CommonStartup.ConfigureServices(services); var provider = services.BuildServiceProvider();
(您将不得不再次添加引用。)
- 您现在可以使用 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/