我有一个包含3个项目的解决方案。 Project2需要Project1才能正常运行(Project2在Project1中调用一些Apis)。
Solution
|-- Project1
| |-- Program.cs
| |-- Startup.cs
|-- Project2
| |-- Program.cs
| |-- Startup.cs
|-- IntegrationTestProject
我可以通过更改解决方案的属性来同时运行这两个项目,如下图所示,它运行良好:
我想要的是一种通过代码(从启动或从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的方法。
答案 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等的交叉引用。
如果您觉得那太过分了,请不要将您的应用拆分为微服务,而是提供一项大型服务-它将更易于管理。至少直到粒度显示出其优点为止的某个时刻