从另一个项目运行.net核心项目

时间:2019-06-27 08:27:12

标签: c# asp.net-core

我有一个包含3个项目的解决方案。 Project2需要Project1才能正常运行(Project2在Project1中调用一些Apis)。

Solution
|-- Project1
|   |-- Program.cs
|   |-- Startup.cs
|-- Project2
|   |-- Program.cs
|   |-- Startup.cs
|-- IntegrationTestProject

我可以通过更改解决方案的属性来同时运行这两个项目,如下图所示,它运行良好:

enter image description here

我想要的是一种通过代码(从启动或从Project2中的SomeService)从Project2运行Project1的方法,如果我在停止运行Project2时也可以停止Project1,那就太好了。

我尝试了这段代码,但它没有启动Project1:

  string[] x = { };
  Project1.Program.Main(x);

编辑:

IntegrationTestProject用于测试Project2 Apis。因此,我从Project2创建了一个new TestServer()

当我运行集成测试时,由于无法访问服务器(Project1),某些API成功(仅依赖Project2的API)和其他API失败(从Project1调用Apis的API) )。

如果我在运行Project1时运行集成测试,则所有测试均成功。

我尝试使用new TestServer()运行Project1的测试实例,并将其传递给Project2。它适用于某些Apis,并且我遇到的另一个问题似乎是直到我运行Project1而不是它的测试实例时才解决。

因此,我唯一的解决方案是在启动集成测试时运行Project1。

我制作了一个.bat文件,该文件运行Project1(通过dotnet运行),然后启动集成测试(通过dotnet测试),并且工作正常。但是问题在于,从Visual Studio运行集成测试时,它没有运行Project1。

编辑2:

这是一个示例项目,演示了我遇到的问题: https://github.com/bilalseh/SampleSolution

1-如果单独运行Project2并调用(获取:“ / api / home”),它将返回结果。 如果您调用(Get:“ / api / home / 5”),则会出现问题,因为此Api取决于Project1。

2-如果您打开Visual Studio并运行测试(2个测试)或通过“ dotnet test”从命令行运行这些测试,则1个测试将通过(测试:“ / api / home”),而一个测试将失败(测试:“ / api / home / 5”)。

3-如果您运行Project1,然后启动测试,则两者都会通过。

4-我在集成测试文件夹中创建了一个名为“使用temp server.bat进行测试”的.bat文件。该文件将运行Project1,然后启动测试,然后停止Project1。如果您运行此文件,则两个测试都将通过。

我想要的是找到一种从Project2或启动集成测试时启动Project1的方法。

2 个答案:

答案 0 :(得分:8)

您可以添加对要启动的项目的程序集的引用。

另一种方法是使用Process.Start()并放置可执行文件的路径以运行它

在要打开其他项目的项目上:

  

右键单击引用->添加引用->解决方案->选中   您要创建的项目->确定

如果编译器要求您(PresentationFramework,system.xaml ...)或通过在“类Program”前面添加“ public”一词使Project 2 Program.cs变为Public,则可能需要添加其他引用。 / p>

并添加此 在“项目1”按钮中...

private void button_Click(object sender, EventArgs e)
{
    Project_2 pb = new Project_2()
    Process.Start(pb.returnPath() + \\"Project_2.exe");
}

编辑:当我在stackoverflow中搜索时,您的问题与此one

类似

答案 1 :(得分:5)

您似乎想采用微服务方式。因此,有两个原则:

1)您应该能够一次调试一个服务-如果您调试依赖于服务B的服务A,则制作一个模拟服务B。然后单独测试/调试服务B-如果所有部分都正常工作,整个机器应该可以工作

2)如果要运行(而不仅仅是调试),请使用Docker / Kubernetes。他们将管理任何重新启动,崩溃,更新等操作。如果要测试整个系统,请仍然运行docker deploy,然后在该系统上运行集成测试

每个微服务都是它自己的东西,对其他微服务没有任何实际依赖,因此没有共享数据库,也没有通过DLL等的交叉引用。

如果您觉得那太过分了,请不要将您的应用拆分为微服务,而是提供一项大型服务-它将更易于管理。至少直到粒度显示出其优点为止的某个时刻