<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:a10="http://www.w3.org/2005/Atom" version="2.0">
  <channel xmlns:media="http://search.yahoo.com/mrss/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <title>ABP.IO Stories</title>
    <link>https://abp.io/community/articles</link>
    <description>A hub for ABP Framework, .NET, and software development. Access articles, tutorials, news, and contribute to the ABP community.</description>
    <lastBuildDate>Wed, 28 Oct 2026 12:02:09 Z</lastBuildDate>
    <generator>Community - ABP.IO</generator>
    <image>
      <url>https://abp.io/assets/favicon.ico/favicon-32x32.png</url>
      <title>ABP.IO Stories</title>
      <link>https://abp.io/community/articles</link>
    </image>
    <a10:link rel="self" type="application/rss+xml" title="self" href="https://abp.io/community/rss?member=prabhjot" />
    <item>
      <guid isPermaLink="true">https://abp.io/community/posts/managing-communication-and-restructring-in-abp-part-4-switching-from-project-references-to-package-references-ql16qwx0</guid>
      <link>https://abp.io/community/posts/managing-communication-and-restructring-in-abp-part-4-switching-from-project-references-to-package-references-ql16qwx0</link>
      <a10:author>
        <a10:name>prabhjot</a10:name>
        <a10:uri>https://abp.io/community/members/prabhjot</a10:uri>
      </a10:author>
      <title>Managing Communication and Restructring in ABP - Part 4: Switching from Project References to Package References</title>
      <description>This post is part 4 of the ABP Multi-App Series, focusing on improving communication and maintainability in Blazor-based ABP applications by switching from project references to package references that simplifies dependency management by allowing usage of NuGet package dependencies within project files</description>
      <pubDate>Tue, 17 Jun 2025 17:48:39 Z</pubDate>
      <a10:updated>2026-10-28T05:37:44Z</a10:updated>
      <content:encoded><![CDATA[<h1>4 - Switching from Project References to Package References</h1>
<h2>Introduction</h2>
<p>This post is part of my <i><code>Managing Communication and Restructring blazor UI in ABP Multi-App</code></i> series.
We are working with three primary applications:</p>
<ul>
<li><code>Prabh.Stock</code> – Manages stock-related functionality</li>
<li><code>Prabh.News</code> – Handles market news and updates</li>
<li><code>Prabh.Finance</code> – Aggregates financial data, integrating both stock and news insights</li>
</ul>
<p>In this article, we’ll switch from Project References to Package References in ABP and explore the key benefits of using package reference, such as loose coupling between services, and faster builds.</p>
<p>Once your solution involves multiple apps or user interfaces, relying solely on project references can quickly become a bottleneck.</p>
<p>This aligns perfectly with ABP’s recommendation to use static client proxies with packaged
HttpApi.Client projects.</p>
<p>These applications use <code>Blazor</code> for the UI layer and <code>PostgreSQL</code> as the database provider.</p>
<h3>🖼️ Screenshots</h3>
<p>Here, the applications screenshot of all three applications.</p>
<p><strong>Prabh.Stock</strong></p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/4-switching-from-project-references-to-package/images/prabh.stocks.png" alt="prabh-stock-ui" /></p>
<p><strong>Prabh.News</strong></p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/4-switching-from-project-references-to-package/images/prabh.news.png" alt="prabh-news-ui" /></p>
<p><strong>Prabh.Finance</strong></p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/4-switching-from-project-references-to-package/images/prabh.finance.png" alt="prabh-finance-ui" /></p>
<h2>Requirements</h2>
<p>The following tools are needed to be able to run the solution.</p>
<ul>
<li>.NET 9.0 SDK</li>
<li>Visual Studio 2022 or another compatible IDE</li>
<li>PostgreSQL</li>
</ul>
<p>Troubleshooting tip</p>
<ul>
<li>If you try to run more than one ABP application's UI at the same time through visual studio, you might encounter issues while running. A simple workaround is to open the second application in a different browser.</li>
</ul>
<h2>⚙️ Setup</h2>
<h3>Open &amp; Run the Application</h3>
<ul>
<li>Open the Stock Application solution in Visual Studio (or your favorite IDE).</li>
<li>Run the <code>Prabh.Stock.DbMigrator</code> application to seed the initial data.</li>
<li>Run the <code>Prabh.Stock.HttpApi.Host</code> application that starts the server side.</li>
<li>Run the <code>Prabh.Stock.Blazor</code> application to start the UI.</li>
<li>Repeat above steps for <strong>Prabh.News</strong> and <strong>Prabh.Finance</strong></li>
<li>Stop All Applications after checking they are working fine.</li>
</ul>
<h2>Development</h2>
<h3>📖 What Are Project References?</h3>
<ul>
<li><p>Project references are a direct link between two projects in the same solution or outside. For example, <code>Prabh.Finance.Blazor.Client</code> UI project may have a reference to <code>Prabh.Finance.HttpApi.Client</code>.</p>
<p>This is fine when:</p>
<ul>
<li><p>All projects are in the same solution.</p>
</li>
<li><p>You are in the early stages of development.</p>
</li>
<li><p>You want immediate access to code changes without publishing.</p>
</li>
</ul>
<p>But it comes with a cost:</p>
<ul>
<li><p>Solutions become tightly coupled.</p>
</li>
<li><p>Builds become slower and more error-prone.</p>
</li>
<li><p>Code sharing across solutions or repositories is difficult.</p>
</li>
<li><p>Managing versioning is impossible.</p>
</li>
</ul>
</li>
</ul>
<h3>📦 Enter Package References</h3>
<ul>
<li><p>Package references are a cleaner alternative — you build your shared projects once, publish them as NuGet packages, and consume them via versioned references.</p>
<p>In the context of ABP and our apps:</p>
<ul>
<li>We generated static client proxies for APIs (instead of using dynamic ones).</li>
<li>We will package them as NuGet packages.</li>
<li>Reference these packages in your consumer UIs or apps.</li>
</ul>
<p>This approach brings:</p>
<ul>
<li>Loose coupling between services.</li>
<li>Faster builds, since projects don’t compile together.</li>
<li>Clear version control and upgrade paths.</li>
<li>Better developer experience when dealing with remote backends or micro-frontends.</li>
</ul>
<p>Comparision between Package v/s Project References</p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/4-switching-from-project-references-to-package/images/package-refernce.png" alt="alt text" /></p>
<p><a href="https://learn.microsoft.com/en-gb/nuget/quickstart/create-and-publish-a-package-using-the-dotnet-cli">Creating and publishing NuGet packages</a> is a broad topic with its own set of <a href="https://learn.microsoft.com/en-gb/nuget/create-packages/package-authoring-best-practices">best practices</a>, so I’ve chosen not to cover it in this video. If you’re interested, you can explore the following resources</p>
</li>
</ul>
<h3>🆕 Create the package using Visual Studio</h3>
<ol>
<li><p>Let's first generate package for <code>Prabh.Stock.HttpApi.Host</code></p>
</li>
<li><p>Go to the root folder of the .Client project and choose project and properties
<img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/4-switching-from-project-references-to-package/images/package-reference-3.png" alt="alt text" /></p>
<ul>
<li>Enter Essentials package details, choose a md file for readme and Choose Licencse type 'SDPX Licence Expression' and in Licence Expression textbox below type 'MIT'</li>
</ul>
</li>
<li><p>Once done, choose release mode and then right-click on the project and select ‘Pack’ after building it again.
<img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/4-switching-from-project-references-to-package/images/package-reference-4.png" alt="alt text" /></p>
</li>
<li><p>If successful, you'll see the output in the Output window.
<img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/4-switching-from-project-references-to-package/images/package-reference-5.png" alt="alt text" /></p>
</li>
<li><p>Create an account on the official NuGet website if you haven't registered already.
<img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/4-switching-from-project-references-to-package/images/package-reference-6.png" alt="alt text" /> and upload your nupkg file that will be in your bin / release folder</p>
</li>
</ol>
<h3>⚠️ Caution: It's always better to use static proxies along with contracts when moving towards NuGet packages</h3>
<ul>
<li><p>You can learn more about it at <a href="https://abp.io/docs/latest/framework/api-development/static-csharp-clients#with-contracts-or-without-contracts">abp docs</a></p>
</li>
<li><p>If we had created the static proxies with contracts in our previous blog, we wouldn't need to create three separate packages now.
<img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/4-switching-from-project-references-to-package/images/blog-4-1.png" alt="alt text" /></p>
</li>
<li><p>There's no need to install all three packages separately. Simply installing the parent package is enough, as it will automatically bring in its dependent packages.</p>
</li>
<li><p>Our csproj file will look somethink like this
<img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/4-switching-from-project-references-to-package/images/blog-4-2.png" alt="alt text" /></p>
</li>
</ul>
<h2>🔌 Run multiple apps</h2>
<ul>
<li>To run everything together:</li>
</ul>
<ol>
<li><p>Right-click on the solution &gt; Set Startup Projects</p>
</li>
<li><p>Choose Multiple startup projects</p>
</li>
<li><p>Select:</p>
<ul>
<li><code>Prabh.Stock.HttpApi.Host</code></li>
<li><code>Prabh.News.HttpApi.Host</code></li>
<li><code>Prabh.Finance.HttpApi.Host</code></li>
<li><code>Prabh.Finance.Blazor</code></li>
</ul>
</li>
<li><p>Once started, you’ll have running instances of : <code>Prabh.Finance UI</code> and all <code>Finance, Stock, and News</code> backends that are using package refernces for communication
<img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/4-switching-from-project-references-to-package/images/final-result.png" alt="final result prabh finance page" /></p>
</li>
</ol>
<h2>Source Code</h2>
<p>Source code of the this completed post is <a href="https://github.com/008programmer/abp-multiple-apps-communication-and-restructuring/tree/4-switching-from-project-references-to-package">available on GitHub</a>.</p>
<h2>Next</h2>
<p>Now that we have replaced our project references with package references, the next step is to replace News and Stocks Blazor application into one backOffice UI app along with Finance UI public app while exploring ABP.</p>
]]></content:encoded>
      <media:thumbnail url="https://abp.io/api/posts/cover-picture-source/3a1a912e-bace-4d26-1a19-bdd2dee90936" />
      <media:content url="https://abp.io/api/posts/cover-picture-source/3a1a912e-bace-4d26-1a19-bdd2dee90936" medium="image" />
    </item>
    <item>
      <guid isPermaLink="true">https://abp.io/community/posts/replacing-dynamic-client-proxies-with-static-client-proxies-g30lf0vx</guid>
      <link>https://abp.io/community/posts/replacing-dynamic-client-proxies-with-static-client-proxies-g30lf0vx</link>
      <a10:author>
        <a10:name>prabhjot</a10:name>
        <a10:uri>https://abp.io/community/members/prabhjot</a10:uri>
      </a10:author>
      <title>Replacing Dynamic client proxies with Static client proxies</title>
      <description>This post covers how to switch from dynamic to static proxies in the ABP Framework. It explains why the change matters, how to implement it step by step, and the key benefits—better performance, stability, and easier maintenance—especially when working with multiple ABP apps.</description>
      <pubDate>Thu, 05 Jun 2025 18:38:43 Z</pubDate>
      <a10:updated>2026-10-28T08:49:25Z</a10:updated>
      <content:encoded><![CDATA[<h1>3 - Replacing Dynamic client proxies with Static client proxies</h1>
<h2>Introduction</h2>
<p>This post is part of my <i><code>Managing Communication and Restructring blazor UI in ABP Multi-App</code></i> series.
We are working with three primary applications:</p>
<ul>
<li><code>Prabh.Stock</code> – Manages stock-related functionality</li>
<li><code>Prabh.News</code> – Handles market news and updates</li>
<li><code>Prabh.Finance</code> – Aggregates financial data, integrating both stock and news insights</li>
</ul>
<p>In this article, we’ll switch from dynamic to static client proxies in ABP and explore the key benefits of using static proxies, such as improved performance, stronger typing, and better maintainability.</p>
<p>These applications use <code>Blazor</code> for the UI layer and <code>PostgreSQL</code> as the database provider.</p>
<h3>🖼️ Screenshots</h3>
<p>Here, the applications screenshot of all three applications.</p>
<p><strong>Prabh.Stock</strong></p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/3-static-over-dyanamic-proxies/images/prabh.stocks.png" alt="prabh-stock-ui" /></p>
<p><strong>Prabh.News</strong></p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/3-static-over-dyanamic-proxies/images/prabh.news.png" alt="prabh-news-ui" /></p>
<p><strong>Prabh.Finance</strong></p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/3-static-over-dyanamic-proxies/images/prabh.finance.png" alt="prabh-finance-ui" /></p>
<h2>Requirements</h2>
<p>The following tools are needed to be able to run the solution.</p>
<ul>
<li>.NET 9.0 SDK</li>
<li>Visual Studio 2022 or another compatible IDE</li>
<li>PostgreSQL</li>
</ul>
<p>Troubleshooting tip</p>
<ul>
<li>If you try to run more than one ABP application's UI at the same time through visual studio, you might encounter issues while running. A simple workaround is to open the second application in a different browser.</li>
</ul>
<h2>⚙️ Setup</h2>
<h3>Open &amp; Run the Application</h3>
<ul>
<li>Open the Stock Application solution in Visual Studio (or your favorite IDE).</li>
<li>Run the <code>Prabh.Stock.DbMigrator</code> application to seed the initial data.</li>
<li>Run the <code>Prabh.Stock.HttpApi.Host</code> application that starts the server side.</li>
<li>Run the <code>Prabh.Stock.Blazor</code> application to start the UI.</li>
<li>Repeat above steps for <strong>Prabh.News</strong> and <strong>Prabh.Finance</strong></li>
<li>Stop All Applications after checking they are working fine.</li>
</ul>
<h2>Development</h2>
<h3>📖 ABP Client Proxy Types</h3>
<ul>
<li><p>ABP provides two types of API client proxies:</p>
<h4>Static Proxies</h4>
<ul>
<li><p>Generated at development time</p>
</li>
<li><p>Faster performance (no runtime metadata fetching)</p>
</li>
<li><p>Must be manually regenerated when API changes</p>
</li>
<li><p>Ideal for production scenarios</p>
</li>
</ul>
<h4>Dynamic Proxies</h4>
<ul>
<li><p>Generated at runtime</p>
</li>
<li><p>No need to regenerate when API changes</p>
</li>
<li><p>Easier to use during early development and testing</p>
</li>
<li><p>Slightly slower at runtime</p>
</li>
</ul>
<p>For more details, check out the official <a href="https://abp.io/docs/latest/framework/api-development/static-csharp-clients">ABP documentation</a></p>
</li>
</ul>
<h3>🆕 Switching from Dynamic to Static Proxies in ABP</h3>
<ol>
<li><p>The backend API must be running when generating the static proxies.
so Let's first generate proxy for <code>Prabh.Stock.HttpApi.Host</code></p>
</li>
<li><p>Go to the root folder of the .Client project whose static proxies we want to generate, in our case it is <code>Prabh.Stock.HttpApi.Client</code></p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/3-static-over-dyanamic-proxies/images/image-3-1.png" alt="alt text" /></p>
</li>
<li><p>Repeat steps 1 and 2 these for <code>News and Finance API</code></p>
</li>
<li><p>Go to <code>Prabh.Stock.HttpApi.Client</code> and replace AddHttpClientProxies with AddHttpClientProxies and repeat for <code>Prabh.Finance.HttpApi.Client</code> and <code>Prabh.News.HttpApi.Client</code></p>
<pre><code class="language-csharp">public class StockHttpApiClientModule : AbpModule
{
    public const string RemoteServiceName = &quot;Stocks&quot;;

    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        context
          .Services
          //.AddHttpClientProxies(
          .AddStaticHttpClientProxies(
            typeof(StockApplicationContractsModule).Assembly,
            RemoteServiceName
        );
    }
}
</code></pre>
</li>
</ol>
<h2>⚠️ Small Fixes for Modular Setup</h2>
<ul>
<li>Typically when a proxy file is generated for a default setup it named is <code>abp-generate-proxy.json</code>, but becuase we are going modular, some fixes needs to done.
<ul>
<li>Rename <code>abp-generate-proxy.json</code> to <code>{RemoteServiceName}-generate-proxy.json</code></li>
<li>Also change rootPath and remoteServiceName to {RemoteServiceName} like the image below
<img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/3-static-over-dyanamic-proxies/images/static1.png" alt="alt text" /></li>
</ul>
</li>
</ul>
<h2>🔌 Run multiple apps</h2>
<ul>
<li>To run everything together:</li>
</ul>
<ol>
<li><p>Right-click on the solution &gt; Set Startup Projects</p>
</li>
<li><p>Choose Multiple startup projects</p>
</li>
<li><p>Select:</p>
<ul>
<li><code>Prabh.Stock.HttpApi.Host</code></li>
<li><code>Prabh.News.HttpApi.Host</code></li>
<li><code>Prabh.Finance.HttpApi.Host</code></li>
<li><code>Prabh.Finance.Blazor</code></li>
</ul>
</li>
<li><p>Once started, you’ll have running instances of : <code>Prabh.Finance UI</code> and all <code>Finance, Stock, and News</code> backends that are using static proxies for communication</p>
</li>
</ol>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/3-static-over-dyanamic-proxies/images/image-4.png" alt="alt text" /></p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/3-static-over-dyanamic-proxies/images/final-result.png" alt="final result prabh finance page" /></p>
<h2>Source Code</h2>
<p>Source code of the this completed post is <a href="https://github.com/008programmer/abp-multiple-apps-communication-and-restructuring/blob/3-static-over-dyanamic-proxies">available on GitHub</a>.</p>
<h2>Next</h2>
<p>Now that we've integrated the <code>Finance UI</code> with all APIs using static proxies, the next step is to replace project references with NuGet package references — and explore the architectural and maintainability advantages this approach offers.</p>
]]></content:encoded>
      <media:thumbnail url="https://abp.io/api/posts/cover-picture-source/3a1a5390-4221-a14e-6a53-42b99bbb8a67" />
      <media:content url="https://abp.io/api/posts/cover-picture-source/3a1a5390-4221-a14e-6a53-42b99bbb8a67" medium="image" />
    </item>
    <item>
      <guid isPermaLink="true">https://abp.io/community/posts/adopting-the-new-.slnx-format-to-organize-applications-and-services-6cm3vl8k</guid>
      <link>https://abp.io/community/posts/adopting-the-new-.slnx-format-to-organize-applications-and-services-6cm3vl8k</link>
      <a10:author>
        <a10:name>prabhjot</a10:name>
        <a10:uri>https://abp.io/community/members/prabhjot</a10:uri>
      </a10:author>
      <title>Adopting the new .slnx format to organize applications and services</title>
      <description>This post shows how to simplify managing multiple related applications by using the new .slnx solution format introduced by .NET. Instead of juggling separate solutions or complex project references, the .slnx format lets you organize all apps and services under one clean, easy-to-manage solution file. It supports grouping projects into folders, improving structure and navigation in Visual Studio. This approach reduces complexity when running or developing multiple apps simultaneously and helps streamline p</description>
      <pubDate>Mon, 02 Jun 2025 19:51:06 Z</pubDate>
      <a10:updated>2026-10-28T06:36:56Z</a10:updated>
      <content:encoded><![CDATA[<h1>2- Adopting the new .slnx format to organize applications and services in a streamlined solution</h1>
<h2>Introduction</h2>
<p>This post is part of my <i><code>Managing Communication and Restructring blazor UI in ABP Multi-App</code></i>.
We are working with three primary applications:</p>
<ul>
<li><code>Prabh.Stock</code> – Manages stock-related functionality</li>
<li><code>Prabh.News</code> – Handles market news and updates</li>
<li><code>Prabh.Finance</code> – Aggregates financial data, integrating both stock and news insights</li>
</ul>
<p>In this article, we’ll simplify running one or more applications simultaneously by introducing a new .slnx solution file at the root level. We’ll add all related projects into it using Visual Studio and organize them into solution folders for better maintainability.</p>
<p>These applications use <code>Blazor</code> for the UI layer and <code>PostgreSQL</code> as the database provider.</p>
<h3>💻 Source Code</h3>
<p>Source code of the this completed post is <a href="https://github.com/008programmer/abp-multiple-apps-communication-and-restructuring/tree/2-manage-complexity-by-new-slnx">available on GitHub</a>.</p>
<h3>🖼️ Screenshots</h3>
<p>Here, the applications screenshot of all three applications.</p>
<p><strong>Prabh.Stock</strong></p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/2-manage-complexity-by-new-slnx/images/prabh.stocks.png" alt="prabh-stock-ui" /></p>
<p><strong>Prabh.News</strong></p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/2-manage-complexity-by-new-slnx/images/prabh.news.png" alt="prabh-news-ui" /></p>
<p><strong>Prabh.Finance</strong></p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/2-manage-complexity-by-new-slnx/images/prabh.finance.png" alt="prabh-finance-ui" /></p>
<h2>Requirements</h2>
<p>The following tools are needed to be able to run the solution.</p>
<ul>
<li>.NET 9.0 SDK</li>
<li>Visual Studio 2022 or another compatible IDE</li>
<li>PostgreSQL</li>
</ul>
<p>Troubleshooting tip</p>
<ul>
<li>If you try to run more than one ABP application's UI at the same time through visual studio, you might encounter issues while running. A simple workaround is to open the second application in a different browser.</li>
</ul>
<h2>⚙️ Setup</h2>
<h3>Open &amp; Run the Application</h3>
<ul>
<li>Open the Stock Application solution in Visual Studio (or your favorite IDE).</li>
<li>Run the <code>Prabh.Stock.DbMigrator</code> application to seed the initial data.</li>
<li>Run the <code>Prabh.Stock.HttpApi.Host</code> application that starts the server side.</li>
<li>Run the <code>Prabh.Stock.Blazor</code> application to start the UI.</li>
<li>Repeat above steps for <strong>Prabh.News</strong> and <strong>Prabh.Finance</strong></li>
<li>Stop All Applications after checking they are working fine.</li>
</ul>
<h2>Development</h2>
<h3>🆕 Add a new Sln file by adding typing <code>dotnet new sln -n Prabh.Apps</code> in the root directory</h3>
<ul>
<li><p>Add a empty solution name 'Prabh.Apps' in the root directory</p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/2-manage-complexity-by-new-slnx/images/image.png" alt="alt text" /></p>
</li>
<li><p>Ok Here is the Twist, dotnet has introduced a new compact &amp; clean format slnx format. so lets migrate to it by typing <code>dotnet sln migrate</code>.
<img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/2-manage-complexity-by-new-slnx/images/image-1.png" alt="alt text" /></p>
</li>
<li><p>Here is the format of new slnx
<img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/2-manage-complexity-by-new-slnx/images/image-5.png" alt="alt text" /></p>
</li>
<li><p>Now open the visual studio using this new <code>Prabh.Apps.slnx</code></p>
</li>
<li><p>Then Right click and go to <code>Add</code> -&gt; <code>New Solution Folder</code></p>
</li>
</ul>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/2-manage-complexity-by-new-slnx/images/image-2.png" alt="alt text" /></p>
<ul>
<li>Right click on solution folder and add existing project.</li>
</ul>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/2-manage-complexity-by-new-slnx/images/image-3.png" alt="alt text" /></p>
<h2>🔌 Run multiple apps</h2>
<ul>
<li>To run everything together:</li>
</ul>
<ol>
<li><p>Right-click on the solution &gt; Set Startup Projects</p>
</li>
<li><p>Choose Multiple startup projects</p>
</li>
<li><p>Select:</p>
<ul>
<li><code>Prabh.Stock.HttpApi.Host</code></li>
<li><code>Prabh.News.HttpApi.Host</code></li>
<li><code>Prabh.Finance.HttpApi.Host</code></li>
<li><code>Prabh.Finance.Blazor</code></li>
</ul>
</li>
<li><p>Once started, you’ll have running instances of : <code>Prabh.Finance UI</code> and all <code>Finance, Stock, and News</code> backends</p>
</li>
</ol>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/2-manage-complexity-by-new-slnx/images/image-4.png" alt="alt text" /></p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/2-manage-complexity-by-new-slnx/images/final-result.png" alt="final result prabh finance page" /></p>
<h2>Source Code</h2>
<p>Source code of the this completed post is <a href="https://github.com/008programmer/abp-multiple-apps-communication-and-restructuring/tree/2-manage-complexity-by-new-slnx">available on GitHub</a>.</p>
<h2>Next</h2>
<p>While we are now able to access the <code>Finance UI</code>, along with the <code>Finance, Stock, and News APIs</code>, from a single unified solution, there’s still room for improvement.</p>
<p>In the upcoming blog posts, we’ll focus on decoupling these applications for better scalability and cleaner architecture. This will be done in two stages:</p>
<ul>
<li><p>Replacing dynamic proxies with static proxies</p>
</li>
<li><p>Switching from project references to NuGet package references</p>
</li>
</ul>
<p>Each step will be covered in a dedicated post to keep the process clear and focused.</p>
]]></content:encoded>
      <media:thumbnail url="https://abp.io/api/posts/cover-picture-source/3a1a445f-736c-90a3-e850-4a2baf4b5d34" />
      <media:content url="https://abp.io/api/posts/cover-picture-source/3a1a445f-736c-90a3-e850-4a2baf4b5d34" medium="image" />
    </item>
    <item>
      <guid isPermaLink="true">https://abp.io/community/posts/accessing-multiple-remote-abp-based-backends-using-httpapi.client-6f4vcggh</guid>
      <link>https://abp.io/community/posts/accessing-multiple-remote-abp-based-backends-using-httpapi.client-6f4vcggh</link>
      <a10:author>
        <a10:name>prabhjot</a10:name>
        <a10:uri>https://abp.io/community/members/prabhjot</a10:uri>
      </a10:author>
      <title>Accessing Multiple Remote ABP based Backends Using HttpApi.Client</title>
      <description>We're making one app (Prabh.Finance) able to call and use data from two other apps – Prabh.Stock (for stock info) and Prabh.News (for news).

To do this, we:

Connect the apps together by adding the right references.

Use the .Client dynamic proxy of other apps.

Use the data from Stock and News APIs inside the Finance app and show it in the UI.

Update CORS so apps are allowed to talk to each other.

This allows us to keep the apps separate but still have them work together smoothly</description>
      <pubDate>Mon, 02 Jun 2025 19:46:45 Z</pubDate>
      <a10:updated>2026-10-28T01:43:02Z</a10:updated>
      <content:encoded><![CDATA[<h1>1- Accessing Multiple Remote ABP based Backends Using HttpApi.Client</h1>
<h2>Introduction</h2>
<p>This post is part of my <i><code>Managing Communication and Restructring blazor UI in ABP Multi-App</code></i>.
We are working with three primary applications:</p>
<ul>
<li><code>Prabh.Stock</code> – Manages stock-related functionality</li>
<li><code>Prabh.News</code> – Handles market news and updates</li>
<li><code>Prabh.Finance</code> – Aggregates financial data, integrating both stock and news insights</li>
</ul>
<p>In this article, we’ll demonstrate how to enable Prabh.Finance to call the backends of Prabh.News and Prabh.Stock by adding their HttpApi.Client projects as references.</p>
<p>These applications use <code>Blazor</code> for the UI layer and <code>PostgreSQL</code> as the database provider.</p>
<h3>💻 Source Code</h3>
<p>Source code of the this completed post is <a href="https://github.com/008programmer/abp-multiple-apps-communication-and-restructuring/tree/2-manage-complexity-by-new-slnx">available on GitHub</a>.
ddd</p>
<h3>🖼️ Screenshots</h3>
<p>Here, the applications screenshot of all three applications.</p>
<p><strong>Prabh.Stock</strong></p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/1-consume-other-apps-api-using-clients/images/prabh.stocks.png" alt="prabh-stock-ui" /></p>
<p><strong>Prabh.News</strong></p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/1-consume-other-apps-api-using-clients/images/prabh.news.png" alt="prabh-news-ui" /></p>
<p><strong>Prabh.Finance</strong></p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/1-consume-other-apps-api-using-clients/images/prabh.finance.png" alt="prabh-finance-ui" /></p>
<h2>Requirements</h2>
<p>The following tools are needed to be able to run the solution.</p>
<ul>
<li>.NET 9.0 SDK</li>
<li>Visual Studio 2022 or another compatible IDE</li>
<li>PostgreSQL</li>
</ul>
<p>Troubleshooting tip</p>
<ul>
<li>If you try to run more than one ABP application's UI at the same time through visual studio, you might encounter issues while running. A simple workaround is to open the second application in a different browser.</li>
</ul>
<h2>Setup</h2>
<h3>Open &amp; Run the Application</h3>
<ul>
<li>Open the Stock Application solution in Visual Studio (or your favorite IDE).</li>
<li>Run the <code>Prabh.Stock.DbMigrator</code> application to seed the initial data.</li>
<li>Run the <code>Prabh.Stock.HttpApi.Host</code> application that starts the server side.</li>
<li>Run the <code>Prabh.Stock.Blazor</code> application to start the UI.</li>
<li>Repeat above steps for <strong>Prabh.News</strong> and <strong>Prabh.Finance</strong></li>
<li>Stop All Applications after checking they are working fine.</li>
</ul>
<h2>Development</h2>
<h3>🆕 <code>Prabh Stock Application</code> Changes</h3>
<ul>
<li><p>Update Remote Service Name for Stock API</p>
<ul>
<li>Open the <code>Prabh.Stock.HttpApi.Client</code> project and update the name of the Stock application's backend remote service to <code>Stock</code>.
<pre><code class="language-csharp">public const string RemoteServiceName = &quot;Default&quot;;
//change to
public const string RemoteServiceName = &quot;Stock&quot;;
</code></pre>
</li>
</ul>
</li>
<li><p>Decouple and Add new value in Remote Service for Stock API</p>
<ul>
<li><p>Add a new <code>Stock</code> property with the same URL as <code>Default</code> in <code>appsettings</code>.</p>
<p>This change is part of our effort to decouple our APIs from the pre-existing backend APIs (such as <code>Accounts</code>, <code>tenant</code>,<code>localization</code>, etc.).</p>
<h3>Going forward:</h3>
</li>
<li><p>The <strong>Stock UI</strong> and any third party(<code>e.g. Prabh Finance UI</code>) will use the <code>Stock</code> prop URL to communicate with APIs developed by us.</p>
</li>
<li><p>The <strong>Stock UI</strong> will use the <code>Default</code> prop URL to communicate with APIs developed by abp and attached to our backend.</p>
<pre><code class="language-json">&quot;RemoteServices&quot;: {
  &quot;Default&quot;: {
    &quot;BaseUrl&quot;: &quot;https://localhost:44354&quot;
  },
  &quot;AbpAccountPublic&quot;: {
    &quot;BaseUrl&quot;: &quot;https://localhost:44354&quot;
  }
}
//add a new prop named Stock
&quot;RemoteServices&quot;: {
  &quot;Default&quot;: {
    &quot;BaseUrl&quot;: &quot;https://localhost:44354&quot;
  },
  &quot;Stock&quot;: {
    &quot;BaseUrl&quot;: &quot;https://localhost:44354&quot;
  },
  &quot;AbpAccountPublic&quot;: {
    &quot;BaseUrl&quot;: &quot;https://localhost:44354&quot;
  }
},
</code></pre>
<p>similar type of changes is needed for <code>News API</code></p>
</li>
</ul>
</li>
</ul>
<h3>🆕 <code>Prabh Finance Application</code> Changes</h3>
<ul>
<li><p>Open the <strong>Prabh Finance Application</strong> solution in Visual Studio (or your preferred IDE).</p>
</li>
<li><p>In the <code>Prabh.Finance.HttpApi.Client</code> project, add project references to:</p>
<ul>
<li><code>Prabh.Stock.HttpApi.Client</code></li>
<li><code>Prabh.News.HttpApi.Client</code>
<pre><code>  &lt;ProjectReference Include=&quot;..\..\..\Prabh.Stock\src\Prabh.Stock.HttpApi.Client\Prabh.Stock.HttpApi.Client.csproj&quot; /&gt;
  &lt;ProjectReference Include=&quot;..\..\..\Prabh.News\src\Prabh.News.HttpApi.Client\Prabh.News.HttpApi.Client.csproj&quot; /&gt;
</code></pre>
</li>
</ul>
</li>
<li><p>Sometimes Visual Studio does show a error related to reference. If you encounter this issue, run the following command in the terminal to resolve it and restart visual studio</p>
<pre><code class="language-cmd">dotnet restore or dotnet build /graphbuild
</code></pre>
</li>
<li><p>Open <code>FinanceHttpApiClientModule</code> module and add <code>StockHttpApiClientModule</code> in the DependsOn(a beauty of ABP modularity)</p>
<pre><code class="language-csharp">using Prabh.Stock;
using Prabh.News;

namespace Prabh.Finance;

[DependsOn(
    // Code remove for brevity
    typeof(StockHttpApiClientModule)
)]
public class FinanceHttpApiClientModule : AbpModule
{
    // Code remove for brevity
}
</code></pre>
</li>
<li><p>You can now access the <strong>Stock APIs</strong> from within the <strong>Finance UI</strong></p>
</li>
<li><p>Similar changes are required to integrate the <strong>News API</strong></p>
</li>
</ul>
<h3>🔗 <code>Prabh Finance Blazor</code> Consume APIs from Stock and News to combine the Data.</h3>
<ul>
<li><p>Open <code>Index.Razor.cs</code> inside Pages of <code>Prabh.Finance.Blazor.Client</code> and change to something like this.</p>
<pre><code class="language-csharp">  using Blazorise;
  using Microsoft.AspNetCore.Components;
  using Prabh.News.Books;
  using Prabh.Stock.Books;
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Threading.Tasks;
  using Volo.Abp.AspNetCore.Components.Alerts;

  namespace Prabh.Finance.Blazor.Client.Pages;


  public record LatestStockNews(string Ticker, string CompanyName, decimal CurrentPrice, string Summary);


  public partial class Index
  {

      [Inject] public IStockAppService StockAppService_HTTP { get; set; }

      [Inject] public INewsAppService NewsAppService_HTTP { get; set; }

      [Inject]  IMessageService MessageService { get; set; }


      private List&lt;LatestStockNews&gt; LatestStockNews = [];
      protected override async Task OnInitializedAsync()
      {
          await base.OnInitializedAsync();

          try
          {
              var stockResponse = await StockAppService_HTTP.GetThisMonthTopStocksAsync();
              var newsResponse = await NewsAppService_HTTP.GetTopMonthlyNewsAsync();

              LatestStockNews = [.. from s in stockResponse.Items.ToList()
                                            join n in newsResponse.Items.ToList() on s.Ticker equals n.Ticker
                                            select new LatestStockNews(s.Ticker, s.CompanyName, s.CurrentPrice, n.Summary)];
          }
          catch (System.Exception ex)
          {
              //This is just to mange eror If any external apis are not working or not reachable.
              MessageService?.Error(&quot;Error calling Stock Or New APis. See Console for me error&quot;);
              Console.WriteLine(ex.Message ?? ex.InnerException.Message);
          }
      }
  }

</code></pre>
</li>
<li><p>Open <code>Index.Razor.cs</code> inside Pages of <code>Prabh.Finance.Blazor.Client</code> and change to something like this.</p>
<pre><code class="language-html">&lt;div class=&quot;card-body f&quot;&gt;
  &lt;div class=&quot;starting-content pe-5&quot; style=&quot;position:static !important&quot;&gt;
    &lt;h1 class=&quot;f3&quot;&gt;Prabh &lt;strong class=&quot;c&quot;&gt;Finance&lt;/strong&gt; Website&lt;/h1&gt;
    &lt;p&gt;💕💕 Utlimate Solution for Finance Management&lt;/p&gt;

    &lt;div&gt;
      @if (LatestStockNews.Count &gt; 0) {
      &lt;CardDeck&gt;
        @foreach (var item in LatestStockNews) {
        &lt;Card Background=&quot;Background.Success&quot; WhiteText&gt;
          &lt;CardBody&gt;
            &lt;CardTitle Size=&quot;5&quot;&gt;
              &lt;div class=&quot;d-flex justify-content-between&quot;&gt;
                &lt;div&gt;@item.CompanyName&lt;/div&gt;
                &lt;div&gt;$ @item.CurrentPrice&lt;/div&gt;
              &lt;/div&gt;
            &lt;/CardTitle&gt;

            &lt;CardText&gt; @item.Summary &lt;/CardText&gt;
          &lt;/CardBody&gt;
        &lt;/Card&gt;
        }
      &lt;/CardDeck&gt;
      } else {
      &lt;Callout Color=&quot;CalloutColor.Danger&quot; HideHeading=&quot;true&quot;&gt;
        &lt;h4&gt;Something is Wrong&lt;/h4&gt;
        &lt;p&gt;
          No stock news could be loaded. Please check with your admin or try
          again later.
        &lt;/p&gt;
      &lt;/Callout&gt;
      }
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
</code></pre>
</li>
</ul>
<h2>⚠️ Wait! <code>CORS</code> Still Needs to Be Configured</h2>
<ul>
<li><p>One final change is needed in the <code>Stock API</code> and <code>News API</code>: currently, these services only accept HTTP requests from specific UI/Domain.</p>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/1-consume-other-apps-api-using-clients/images/cors-error.png" alt="alt text" /></p>
<p>Please update the appsettings.json of both projects to allow requests from Prabh Finance UI, then restart the applications.</p>
<ul>
<li><code>Prabh.Stock.HttpApi.Host</code></li>
<li><code>Prabh.News.HttpApi.Host</code></li>
</ul>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/1-consume-other-apps-api-using-clients/images/cors-appsetting.png" alt="alt text" /></p>
</li>
</ul>
<h2>🔌 Run &amp; Results</h2>
<ul>
<li>Run these project
<ul>
<li><code>Prabh.Stock.HttpApi.Host</code></li>
<li><code>Prabh.News.HttpApi.Host</code></li>
<li><code>Prabh.Finance.HttpApi.Host</code></li>
<li><code>Prabh.Finance.Blazor</code></li>
</ul>
</li>
</ul>
<p><img src="https://raw.githubusercontent.com/008programmer/abp-multiple-apps-communication-and-restructuring/1-consume-other-apps-api-using-clients/images/final-result.png" alt="final result prabh finance page" /></p>
<h2>Source Code</h2>
<p>Source code of the this completed post is <a href="https://github.com/008programmer/abp-multiple-apps-communication-and-restructuring/tree/1-consume-other-apps-api-using-clients">available on GitHub</a>.</p>
<h2>Next</h2>
<ul>
<li><p>While we are able to access <code>Stock API</code> and <code>News API</code> from <code>Finance UI</code>, But we found out that the process to run all four applications are quite complex and separated.</p>
</li>
<li><p>So, Our Next post is going to be 'Adopting the new .slnx format to organize applications and services in a streamlined solution' and is
<a href="https://github.com/008programmer/abp-multiple-apps-communication-and-restructuring/tree/2-manage-complexity-by-new-slnx">available on GitHub</a></p>
</li>
</ul>
]]></content:encoded>
      <media:thumbnail url="https://abp.io/api/posts/cover-picture-source/3a1a445b-7847-60ca-9c01-9bd60350c7ce" />
      <media:content url="https://abp.io/api/posts/cover-picture-source/3a1a445b-7847-60ca-9c01-9bd60350c7ce" medium="image" />
    </item>
  </channel>
</rss>