<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Oğuzhan Ağır</title>
    <description>The latest articles on DEV Community by Oğuzhan Ağır (@oguzhan-agir-02).</description>
    <link>https://dev.to/oguzhan-agir-02</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3539671%2Fd3984a88-381b-49c9-8803-19e8e6f03508.jpg</url>
      <title>DEV Community: Oğuzhan Ağır</title>
      <link>https://dev.to/oguzhan-agir-02</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oguzhan-agir-02"/>
    <language>en</language>
    <item>
      <title>Why ASP.NET Zero Is a Strong Starting Point for Building SaaS Products</title>
      <dc:creator>Oğuzhan Ağır</dc:creator>
      <pubDate>Wed, 24 Jun 2026 07:23:49 +0000</pubDate>
      <link>https://dev.to/oguzhan-agir-02/why-aspnet-zero-is-a-strong-starting-point-for-building-saas-products-1009</link>
      <guid>https://dev.to/oguzhan-agir-02/why-aspnet-zero-is-a-strong-starting-point-for-building-saas-products-1009</guid>
      <description>&lt;p&gt;Building a SaaS product is rarely just about building the main product features.&lt;/p&gt;

&lt;p&gt;At first, most teams focus on the visible parts of the application. If the product is a CRM, they think about lead management, customer profiles, sales pipelines, and reporting. If it is an ERP, they focus on modules such as inventory, purchasing, finance, and operations. If it is a B2B portal, they think about dashboards, workflows, customer access, and integrations.&lt;/p&gt;

&lt;p&gt;But once development starts, another reality appears.&lt;/p&gt;

&lt;p&gt;Before users can actually use the product, the team needs to build a large amount of foundational infrastructure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login and registration&lt;/li&gt;
&lt;li&gt;User management&lt;/li&gt;
&lt;li&gt;Role and permission management&lt;/li&gt;
&lt;li&gt;Tenant management&lt;/li&gt;
&lt;li&gt;Dashboard and admin screens&lt;/li&gt;
&lt;li&gt;Settings management&lt;/li&gt;
&lt;li&gt;Audit logs&lt;/li&gt;
&lt;li&gt;Email and notification structure&lt;/li&gt;
&lt;li&gt;API architecture&lt;/li&gt;
&lt;li&gt;Frontend and backend organization&lt;/li&gt;
&lt;li&gt;Data isolation between customers&lt;/li&gt;
&lt;li&gt;Subscription, package, or payment-related flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not always the most exciting parts of a SaaS product. However, they are critical. They directly affect security, scalability, maintainability, and long-term product quality.&lt;/p&gt;

&lt;p&gt;This is where ASP.NET Zero can become a strong starting point.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aspnetzero.com/blog/why-asp.net-zero-is-a-strong-starting-point-for-building-saas-products" rel="noopener noreferrer"&gt;ASP.NET Zero Related Blog Post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ASP.NET Zero is not a ready-made SaaS product. It does not build your CRM, ERP, customer portal, or marketplace automatically. Instead, it gives development teams a production-oriented application foundation so they can spend less time building generic infrastructure and more time building the features that make the product valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Cost of Building SaaS Infrastructure from Scratch
&lt;/h2&gt;

&lt;p&gt;Many companies underestimate how much time is spent on infrastructure before the first real business feature becomes usable.&lt;/p&gt;

&lt;p&gt;For example, a startup planning to build a CRM may initially define features such as lead tracking, customer cards, sales activities, offer management, reports, and team collaboration.&lt;/p&gt;

&lt;p&gt;But before these features can work properly, the product also needs a secure and manageable system behind them.&lt;/p&gt;

&lt;p&gt;Who can access which customer records?&lt;/p&gt;

&lt;p&gt;Can different companies use the same application without seeing each other’s data?&lt;/p&gt;

&lt;p&gt;Can admins manage users and permissions?&lt;/p&gt;

&lt;p&gt;Can the system keep logs of important actions?&lt;/p&gt;

&lt;p&gt;Can different tenants have different settings?&lt;/p&gt;

&lt;p&gt;Can emails be managed through templates?&lt;/p&gt;

&lt;p&gt;Can the application scale as more customers join?&lt;/p&gt;

&lt;p&gt;If all of these are built from zero, the MVP timeline can easily expand. What looks like a simple SaaS product may require months of foundational work before the team reaches the core product logic.&lt;/p&gt;

&lt;p&gt;ASP.NET Zero helps reduce this initial infrastructure burden.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpd4bx9xe5rxzcjp53noy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpd4bx9xe5rxzcjp53noy.png" alt="Build SaaS from Scratch vs ASP.NET Zero" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ASP.NET Zero as a SaaS Foundation, Not a Finished Product
&lt;/h2&gt;

&lt;p&gt;It is important to position ASP.NET Zero correctly.&lt;/p&gt;

&lt;p&gt;ASP.NET Zero should not be seen as a finished SaaS product that only needs small edits. It is better understood as a strong technical foundation for building custom SaaS applications.&lt;/p&gt;

&lt;p&gt;This distinction matters.&lt;/p&gt;

&lt;p&gt;Every serious SaaS product has its own business logic. A CRM, an ERP, a B2B ordering platform, or a branch management system will each have different workflows, data models, user journeys, and reporting needs.&lt;/p&gt;

&lt;p&gt;ASP.NET Zero does not remove the need for custom development. Instead, it helps the development team start from a more advanced point.&lt;/p&gt;

&lt;p&gt;This can be especially useful for companies that want to launch an MVP faster, validate the product idea earlier, and avoid spending the first phase of development only on technical infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built-in Multi-Tenancy for SaaS Products
&lt;/h2&gt;

&lt;p&gt;Multi-tenancy is one of the most important concepts in SaaS architecture.&lt;/p&gt;

&lt;p&gt;In a SaaS model, a single application often serves multiple customers, companies, branches, or organizations. Each customer expects their own data, users, roles, and settings to remain isolated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbt5j8xa9bpj83tasn7d8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbt5j8xa9bpj83tasn7d8.png" alt="ASP.NET Zero Multi Tenant SaaS Architecture" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A CRM may serve multiple companies.&lt;/li&gt;
&lt;li&gt;An ERP system may serve different businesses from the same platform.&lt;/li&gt;
&lt;li&gt;A dealer management system may serve many dealers.&lt;/li&gt;
&lt;li&gt;A branch management system may support different locations under one structure.&lt;/li&gt;
&lt;li&gt;A B2B portal may provide separate access for each client company.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building this structure from scratch requires careful design. The development team needs to think about data isolation, tenant-specific settings, user access, security rules, and administration flows.&lt;/p&gt;

&lt;p&gt;ASP.NET Zero provides a multi-tenancy-ready foundation, making it easier to build applications where multiple customers or organizations can use the same software environment with separated data and management areas.&lt;/p&gt;

&lt;p&gt;It allows SaaS teams to design products that are not limited to one company or one internal operation. The same application can be structured to serve many customers, making the product more scalable as a commercial software business.&lt;/p&gt;

&lt;h2&gt;
  
  
  Faster MVP Development
&lt;/h2&gt;

&lt;p&gt;One of the biggest advantages of using ASP.NET Zero is the ability to move faster toward an MVP.&lt;/p&gt;

&lt;p&gt;An MVP should not mean a weak or poorly structured product. It should mean a focused first version that validates the core business idea with the minimum required scope.&lt;/p&gt;

&lt;p&gt;However, many SaaS MVPs fail to launch quickly because teams spend too much time building generic infrastructure.&lt;/p&gt;

&lt;p&gt;ASP.NET Zero can help reduce this problem.&lt;/p&gt;

&lt;p&gt;With many foundational parts already available, the development team can focus earlier on the modules that directly create customer value.&lt;/p&gt;

&lt;p&gt;For example, in a CRM product, the team can focus on lead management, pipeline workflows, customer history, and reporting. In an ERP product, the team can focus on inventory, purchasing, finance, and operational workflows. In a B2B portal, the team can focus on customer-specific dashboards, order flows, document sharing, and approval processes.&lt;/p&gt;

&lt;p&gt;This can shorten the distance between idea and market validation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxc2kqse3v2zk8itr6fv5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxc2kqse3v2zk8itr6fv5.png" alt="SaaS MVP Timeline ASP.NET Zero" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Faster Module Development with ASP.NET Zero Power Tools
&lt;/h2&gt;

&lt;p&gt;ASP.NET Zero Power Tools helps teams speed up repetitive CRUD development by generating code from entity definitions.&lt;/p&gt;

&lt;p&gt;In SaaS products, many modules follow similar patterns: customers, leads, products, orders, branches, employees, requests, or records. Building each one manually requires repeating entity setup, database structure, application services, DTOs, permissions, and UI pages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkorq453k1454rd4f97kh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkorq453k1454rd4f97kh.png" alt="ASP.NET Zero Power Tools Code Generation" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Power Tools reduces this repetitive work and gives developers a faster starting point for standard data management features.&lt;/p&gt;

&lt;p&gt;It does not replace custom business logic, workflows, integrations, or reporting. However, it helps teams spend less time on boilerplate code and more time on the features that create real product value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Better Starting Point for Custom Business Applications
&lt;/h2&gt;

&lt;p&gt;ASP.NET Zero can be especially useful for companies building custom B2B software.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fad3kivro2t8vgyxa5lp7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fad3kivro2t8vgyxa5lp7.png" alt="ASP.NET Zero SaaS Use Cases" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some common use cases include:&lt;/p&gt;

&lt;h3&gt;
  
  
  CRM Systems
&lt;/h3&gt;

&lt;p&gt;A CRM needs users, roles, customer records, activity tracking, dashboards, reporting, and often multi-company support.&lt;/p&gt;

&lt;p&gt;ASP.NET Zero provides a strong base for the administrative and security side, allowing the team to focus on CRM-specific workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  ERP Systems
&lt;/h3&gt;

&lt;p&gt;ERP products usually require complex permissions, multiple modules, auditability, settings, and structured administration.&lt;/p&gt;

&lt;p&gt;Starting from a mature application foundation can reduce the amount of repetitive setup work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Customer Portals
&lt;/h3&gt;

&lt;p&gt;Customer portals often need secure login, customer-specific data access, document sharing, notifications, and role-based permissions.&lt;/p&gt;

&lt;p&gt;ASP.NET Zero can support the foundation needed to build these portal experiences.&lt;/p&gt;

&lt;h3&gt;
  
  
  B2B SaaS Platforms
&lt;/h3&gt;

&lt;p&gt;B2B SaaS platforms need a strong backend structure, tenant management, user control, and scalable application architecture.&lt;/p&gt;

&lt;p&gt;ASP.NET Zero can help teams avoid starting from an empty project and instead begin with a more complete technical base.&lt;/p&gt;

&lt;h3&gt;
  
  
  Branch and Dealer Management Systems
&lt;/h3&gt;

&lt;p&gt;Branch and dealer systems often require multi-tenant or multi-organization structures, role-based access, reporting, and administrative control.&lt;/p&gt;

&lt;p&gt;ASP.NET Zero’s foundation is well aligned with these requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Time and Cost Impact
&lt;/h2&gt;

&lt;p&gt;Building SaaS infrastructure from scratch does not only increase development time. It also increases cost and project risk.&lt;/p&gt;

&lt;p&gt;Every custom-built infrastructure module requires analysis, development, testing, security review, bug fixing, maintenance, documentation, and future improvements.&lt;/p&gt;

&lt;p&gt;When a team builds everything manually, they are not only paying for initial development. They are also taking responsibility for maintaining all of those foundational systems over time.&lt;/p&gt;

&lt;p&gt;ASP.NET Zero can reduce this burden by providing many common application components from the start.&lt;/p&gt;

&lt;p&gt;This does not eliminate development cost. Custom business logic, UI requirements, integrations, reporting, workflows, and product-specific modules still need to be designed and built.&lt;/p&gt;

&lt;p&gt;However, it can help reduce the amount of time spent on repetitive infrastructure work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Non-Technical Founders
&lt;/h2&gt;

&lt;p&gt;For non-technical founders and business owners, the value of ASP.NET Zero may not be immediately obvious.&lt;/p&gt;

&lt;p&gt;It is not simply about having ready-made technical modules.&lt;/p&gt;

&lt;p&gt;The real value is that the development team can start with a stronger foundation instead of spending the early stages of the project on invisible infrastructure.&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster MVP planning&lt;/li&gt;
&lt;li&gt;Less duplicated development work&lt;/li&gt;
&lt;li&gt;More focus on business features&lt;/li&gt;
&lt;li&gt;Better structure for future growth&lt;/li&gt;
&lt;li&gt;A more professional starting point&lt;/li&gt;
&lt;li&gt;Reduced technical uncertainty in the first phase&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a founder, this can directly affect budget, launch timeline, and product validation speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building a SaaS product is not only about developing the features users see. A significant part of the work is hidden in the infrastructure: authentication, authorization, tenant management, user roles, admin panels, audit logs, settings, email structure, and scalable architecture.&lt;/p&gt;

&lt;p&gt;ASP.NET Zero gives teams a strong foundation for these common requirements, helping them avoid rebuilding the same infrastructure from scratch.&lt;/p&gt;

&lt;p&gt;It is not a finished SaaS product, but for SaaS ideas, B2B platforms, CRM systems, ERP systems, customer portals, and branch or dealer management solutions, it can be a strong starting point for building faster and more predictably.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Building with ASP.NET Zero
&lt;/h2&gt;

&lt;p&gt;If you are planning to build a SaaS product, CRM, ERP, customer portal, or B2B platform, ASP.NET Zero gives you a strong foundation instead of starting from scratch.&lt;/p&gt;

&lt;p&gt;Explore ASP.NET Zero pricing and choose the right plan for your SaaS product.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aspnetzero.com/pricing" rel="noopener noreferrer"&gt;View Pricing&lt;/a&gt;&lt;/p&gt;

</description>
      <category>saas</category>
      <category>dotnet</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>React Performance: Preventing Unnecessary Re-renders</title>
      <dc:creator>Oğuzhan Ağır</dc:creator>
      <pubDate>Wed, 11 Mar 2026 21:47:24 +0000</pubDate>
      <link>https://dev.to/oguzhan-agir-02/react-performance-preventing-unnecessary-re-renders-4n5</link>
      <guid>https://dev.to/oguzhan-agir-02/react-performance-preventing-unnecessary-re-renders-4n5</guid>
      <description>&lt;p&gt;The original and complete version of this article is available on the ASP.NET Zero blog:&lt;br&gt;
&lt;a href="https://aspnetzero.com/blog/react-performance-and-preventing-unnecessary-renders" rel="noopener noreferrer"&gt;https://aspnetzero.com/blog/react-performance-and-preventing-unnecessary-renders&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;React applications can sometimes feel slow even when everything appears to work correctly. The UI renders, no errors occur, yet interactions feel sluggish. Buttons respond with slight delays, scrolling may stutter, and typing can occasionally feel laggy.&lt;/p&gt;

&lt;p&gt;In many cases, the underlying reason is &lt;strong&gt;unnecessary component re-renders&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;React does not rebuild the entire DOM on every update. Instead, when a component renders:&lt;/p&gt;

&lt;p&gt;• The component function executes again&lt;br&gt;
• React generates a new virtual tree&lt;br&gt;
• React compares it with the previous render&lt;br&gt;
• Only the necessary DOM updates are applied&lt;/p&gt;

&lt;p&gt;This means a &lt;strong&gt;re-render does not necessarily mean a DOM update&lt;/strong&gt;. However, every render still executes the component function again, which may involve expensive calculations, large lists, or complex component trees.&lt;/p&gt;
&lt;h2&gt;
  
  
  A Common Cause of Performance Issues
&lt;/h2&gt;

&lt;p&gt;One of the most common causes of unnecessary renders is placing state too high in the component tree.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;HeavyComponent&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even though &lt;code&gt;HeavyComponent&lt;/code&gt; does not use the &lt;code&gt;count&lt;/code&gt; state, it will still re-render whenever the parent component renders.&lt;/p&gt;

&lt;p&gt;A better approach is &lt;strong&gt;state colocation&lt;/strong&gt;, meaning state should live in the lowest possible component that actually needs it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memoization and Referential Stability
&lt;/h2&gt;

&lt;p&gt;React also provides tools such as:&lt;/p&gt;

&lt;p&gt;• &lt;code&gt;React.memo&lt;/code&gt;&lt;br&gt;
• &lt;code&gt;useMemo&lt;/code&gt;&lt;br&gt;
• &lt;code&gt;useCallback&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;These tools help prevent unnecessary renders by stabilizing props and avoiding repeated calculations. However, they should be used carefully, because excessive memoization can add complexity without improving performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rendering Large Lists
&lt;/h2&gt;

&lt;p&gt;When working with very large lists, rendering every element can become expensive. In such cases, techniques like &lt;strong&gt;virtualization&lt;/strong&gt; can significantly improve performance by rendering only the visible portion of the list.&lt;/p&gt;

&lt;p&gt;Libraries such as:&lt;/p&gt;

&lt;p&gt;• &lt;code&gt;react-window&lt;/code&gt;&lt;br&gt;
• &lt;code&gt;react-virtuoso&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;allow React applications to handle thousands of rows efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure Before Optimizing
&lt;/h2&gt;

&lt;p&gt;Performance optimization should always begin with measurement rather than assumptions. Tools like the &lt;strong&gt;React DevTools Profiler&lt;/strong&gt; help identify which components render, why they render, and how long they take.&lt;/p&gt;

&lt;p&gt;Without profiling, optimization often becomes guesswork.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the Full Article
&lt;/h2&gt;

&lt;p&gt;This post only provides a brief overview of the topic.&lt;/p&gt;

&lt;p&gt;The full article explains in detail:&lt;/p&gt;

&lt;p&gt;• React re-render mechanics&lt;br&gt;
• architectural performance principles&lt;br&gt;
• Context API performance pitfalls&lt;br&gt;
• referential stability problems&lt;br&gt;
• real-world optimization strategies for large React applications&lt;/p&gt;

&lt;p&gt;Read the complete guide here:&lt;br&gt;
&lt;a href="https://aspnetzero.com/blog/react-performance-and-preventing-unnecessary-renders" rel="noopener noreferrer"&gt;https://aspnetzero.com/blog/react-performance-and-preventing-unnecessary-renders&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>performance</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The True Face of Referential Equality and Optimizations in React</title>
      <dc:creator>Oğuzhan Ağır</dc:creator>
      <pubDate>Fri, 06 Mar 2026 20:40:59 +0000</pubDate>
      <link>https://dev.to/oguzhan-agir-02/the-true-face-of-referential-equality-and-optimizations-in-react-3m32</link>
      <guid>https://dev.to/oguzhan-agir-02/the-true-face-of-referential-equality-and-optimizations-in-react-3m32</guid>
      <description>&lt;p&gt;When performance issues arise in React applications, &lt;code&gt;React.memo&lt;/code&gt;, &lt;code&gt;useMemo&lt;/code&gt;, and &lt;code&gt;useCallback&lt;/code&gt; are usually the first things that come to mind. In practice, however, adding these tools often merely complicates the code without delivering the expected performance boost.&lt;/p&gt;

&lt;p&gt;The underlying reason isn't that React is inadequate, but rather a fundamental misunderstanding of &lt;strong&gt;referential equality&lt;/strong&gt; within React's render model and how these optimization tools actually work.&lt;/p&gt;

&lt;h2&gt;
  
  
  React's Decision Mechanism: Value vs. Reference
&lt;/h2&gt;

&lt;p&gt;When deciding whether to re-render a component, React doesn't check the contents of the data (structural equality). Instead, it checks if the data points to the same location in memory (referential equality). It uses a shallow comparison similar to JavaScript's &lt;code&gt;Object.is()&lt;/code&gt; method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, even though objects &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; have identical content, they point to different memory locations. Therefore, React considers them &lt;strong&gt;completely different&lt;/strong&gt; values. This becomes critical especially when objects, arrays, and functions are passed as props to child components.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Shallow Comparison Preference
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;React.memo&lt;/code&gt;, &lt;code&gt;PureComponent&lt;/code&gt;, and Hook dependency arrays intentionally perform a shallow comparison. If React were to deeply compare every property within objects during every render, the performance cost would be significantly higher.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Child&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/* ... */&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Parent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// A new 'options' object is created in memory during every render.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;pageSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Child&lt;/span&gt; &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, every time the &lt;code&gt;Parent&lt;/code&gt; component renders, a new &lt;code&gt;options&lt;/code&gt; object is created in memory. Even though the &lt;code&gt;Child&lt;/code&gt; component is wrapped in &lt;code&gt;React.memo&lt;/code&gt;, the optimization cannot kick in because the reference of the &lt;code&gt;options&lt;/code&gt; prop has changed, causing the &lt;code&gt;Child&lt;/code&gt; to re-render unnecessarily.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impact on the Reconciliation Process
&lt;/h2&gt;

&lt;p&gt;In React, rendering does not mean directly updating the DOM. During the render phase, React generates a new component tree (Fiber tree) and compares it with the previous one (Reconciliation).&lt;/p&gt;

&lt;p&gt;If a component's state or prop references have changed, React re-renders that component and its entire subtree. Even if there are no actual changes to the DOM, constantly changing references force React to perform this comparison repeatedly, wasting CPU cycles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why useMemo and useCallback Fall Short
&lt;/h2&gt;

&lt;p&gt;These two Hooks are designed to keep references stable (memoization), but when implemented incorrectly, they only add overhead to the application.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Limits of useMemo:&lt;/strong&gt; &lt;code&gt;useMemo&lt;/code&gt; is used to cache expensive calculations or keep references stable. However, if a value in the dependency array changes its reference on every render, the calculation inside &lt;code&gt;useMemo&lt;/code&gt; will re-run every time. In this case, not only does the optimization fail, but React is also burdened with the extra work of tracking these dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Role of useCallback:&lt;/strong&gt; &lt;code&gt;useCallback&lt;/code&gt; caches function definitions. But if a function depends on a frequently updated state (e.g., state changing on every keystroke in a text input), this function will be recreated with every keystroke. Passing this function as a prop to child components will cause them to continuously re-render as well.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Every Render Creates Its Own Scope (Closures)
&lt;/h2&gt;

&lt;p&gt;In React, every render creates its own lexical scope. This means that during each render, a "snapshot" of the current state and prop values is taken.&lt;/p&gt;

&lt;p&gt;Functions within a component capture the values belonging to that specific render. When the state updates, the component re-renders, a new snapshot is taken, and naturally, brand-new functions working with these new values are created in memory. This is React's expected behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Solutions Over Forced Optimization
&lt;/h2&gt;

&lt;p&gt;Instead of trying to forcefully stabilize references using &lt;code&gt;useMemo&lt;/code&gt; and &lt;code&gt;useCallback&lt;/code&gt;, rethinking the component architecture is often a more permanent and cleaner solution.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Moving State Down:&lt;/strong&gt; If a piece of state only affects a specific child component, move that state directly into the child rather than keeping it in the parent. This prevents the parent from rendering unnecessarily.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lifting Content Up (Children Prop):&lt;/strong&gt; By passing expensive components to a parent via the &lt;code&gt;children&lt;/code&gt; prop, you can ensure that the child components are unaffected when the parent's state changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using Primitive Values:&lt;/strong&gt; Instead of passing an entire object to child components as a prop, pass only the necessary primitive values like &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;number&lt;/code&gt;, or &lt;code&gt;boolean&lt;/code&gt;. Primitives are always compared by value, not by reference.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;React.memo&lt;/code&gt;, &lt;code&gt;useMemo&lt;/code&gt;, and &lt;code&gt;useCallback&lt;/code&gt; are not magic wands. These tools only provide benefits in applications where the architecture and data flow are properly structured. If you are experiencing performance issues, rather than immediately reaching for these Hooks, it is much better to ask architectural questions like, "Where should this component's state live?" or "Do I really need to pass this prop?"&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>architecture</category>
    </item>
    <item>
      <title>When Are Custom Hooks an Advantage in React, and When Do They Become a Liability?</title>
      <dc:creator>Oğuzhan Ağır</dc:creator>
      <pubDate>Fri, 06 Feb 2026 08:34:02 +0000</pubDate>
      <link>https://dev.to/oguzhan-agir-02/when-are-custom-hooks-an-advantage-in-react-and-when-do-they-become-a-liability-4eb0</link>
      <guid>https://dev.to/oguzhan-agir-02/when-are-custom-hooks-an-advantage-in-react-and-when-do-they-become-a-liability-4eb0</guid>
      <description>&lt;p&gt;Custom hooks are one of React’s most powerful abstraction tools but they’re also one of the easiest ways to quietly make a codebase harder to understand.&lt;/p&gt;

&lt;p&gt;In real projects, I’ve often seen hooks introduced with good intentions, only to later cause questions like:&lt;/p&gt;

&lt;p&gt;What does this hook actually do?&lt;/p&gt;

&lt;p&gt;Why is changing this so risky?&lt;/p&gt;

&lt;p&gt;Why do I need to read three hooks to understand one component?&lt;/p&gt;

&lt;p&gt;This article looks at when custom hooks genuinely improve readability and reuse, and when they become a liability due to premature or over generalized abstraction. It focuses on practical signals, concrete examples, and questions you can ask before extracting logic into a hook.&lt;/p&gt;

&lt;p&gt;If you’ve ever wondered whether a hook is simplifying your component or just hiding complexity, you might find this useful:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://aspnetzero.com/blog/react-custom-hooks-pros-cons" rel="noopener noreferrer"&gt;https://aspnetzero.com/blog/react-custom-hooks-pros-cons&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>programming</category>
      <category>typescript</category>
    </item>
    <item>
      <title>An ASP.NET Core + React Template Worth Reviewing</title>
      <dc:creator>Oğuzhan Ağır</dc:creator>
      <pubDate>Thu, 22 Jan 2026 12:06:05 +0000</pubDate>
      <link>https://dev.to/oguzhan-agir-02/an-aspnet-core-react-template-worth-reviewing-3kd6</link>
      <guid>https://dev.to/oguzhan-agir-02/an-aspnet-core-react-template-worth-reviewing-3kd6</guid>
      <description>&lt;p&gt;For those looking for an example of how a starting structure can be set up for ASP.NET Core + React, sharing this as a reference.&lt;/p&gt;

&lt;p&gt;There is a React based UI on the ASP.NET Zero side. It makes it possible to see how concerns such as login, authorization, tenant separation, basic administration pages, and localization are handled on the React side.&lt;/p&gt;

&lt;p&gt;On the frontend, Vite, Ant Design, Redux Toolkit, and TypeScript are used. The backend follows a familiar ASP.NET Core structure.&lt;/p&gt;

&lt;p&gt;For those who want to take a closer look, the article is here:&lt;br&gt;
&lt;a href="https://aspnetzero.com/blog/react-ui-has-arrived-in-aspnet-zero" rel="noopener noreferrer"&gt;https://aspnetzero.com/blog/react-ui-has-arrived-in-aspnet-zero&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>dotnet</category>
      <category>webdev</category>
    </item>
    <item>
      <title>ASP.NET Core Dependency Injection From Scopes &amp; Lifetimes to .NET 9 Source Generators</title>
      <dc:creator>Oğuzhan Ağır</dc:creator>
      <pubDate>Thu, 23 Oct 2025 06:19:24 +0000</pubDate>
      <link>https://dev.to/oguzhan-agir-02/aspnet-core-dependency-injection-from-scopes-lifetimes-to-net-9-source-generators-3f06</link>
      <guid>https://dev.to/oguzhan-agir-02/aspnet-core-dependency-injection-from-scopes-lifetimes-to-net-9-source-generators-3f06</guid>
      <description>&lt;p&gt;Dependency Injection in ASP.NET Core is simple... until you hit a subtle memory leak or a captive dependency bug.&lt;/p&gt;

&lt;p&gt;Are you &lt;em&gt;positive&lt;/em&gt; you're not creating a "captive dependency"? Do you know the right way to use a &lt;code&gt;Scoped&lt;/code&gt; service (like a &lt;code&gt;DbContext&lt;/code&gt;) inside a &lt;code&gt;Singleton&lt;/code&gt; background worker?&lt;/p&gt;

&lt;p&gt;I've just published a guide that goes beyond the basics and dives into the advanced patterns and new features you need to know.&lt;/p&gt;

&lt;p&gt;This isn't just &lt;code&gt;AddTransient&lt;/code&gt; vs. &lt;code&gt;AddScoped&lt;/code&gt; again. We cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Captive Dependency trap&lt;/strong&gt; (and how to fix it).&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;IServiceScopeFactory&lt;/code&gt; in &lt;code&gt;IHostedService&lt;/code&gt; like a pro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;.NET 9 Source Generators&lt;/strong&gt; for blazing fast startup &amp;amp; Native AOT.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyed Services&lt;/strong&gt; (&lt;code&gt;[FromKeyedServices("key")]&lt;/code&gt;) for runtime flexibility.&lt;/li&gt;
&lt;li&gt;The Decorator Pattern for clean, cross-cutting concerns.&lt;/li&gt;
&lt;li&gt;Proper async cleanup with &lt;code&gt;IAsyncDisposable&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can move beyond the basics and start writing robust, testable, and high performing DI compatible code. This guide shows you how.&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 &lt;strong&gt;&lt;a href="https://abp.io/community/articles/the-asp.net-core-dependency-injection-system-3vbsdhq8#gsc.tab=0" rel="noopener noreferrer"&gt;Read the Full Guide on ABP.io&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;What's your favorite &lt;code&gt;Dependency Injection&lt;/code&gt; hack? Let me know in the comments! 👇&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>aspnetcore</category>
      <category>webdev</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Building an In-Memory Background Job Queue in ASP.NET Core (Intro + Deep Dive Link)</title>
      <dc:creator>Oğuzhan Ağır</dc:creator>
      <pubDate>Tue, 30 Sep 2025 11:51:53 +0000</pubDate>
      <link>https://dev.to/oguzhan-agir-02/building-an-in-memory-background-job-queue-in-aspnet-core-intro-deep-dive-link-11aj</link>
      <guid>https://dev.to/oguzhan-agir-02/building-an-in-memory-background-job-queue-in-aspnet-core-intro-deep-dive-link-11aj</guid>
      <description>&lt;p&gt;If you've ever wondered how to run asynchronous, long running tasks &lt;em&gt;without&lt;/em&gt; blocking your API responses and &lt;em&gt;without&lt;/em&gt; pulling in external dependencies like Hangfire or RabbitMQ this might interest you.&lt;/p&gt;

&lt;p&gt;In my latest article on ABP Community, I walk through &lt;strong&gt;how to build an in memory background job queue from scratch&lt;/strong&gt; using only built in .NET tooling (&lt;code&gt;IHostedService&lt;/code&gt;, &lt;code&gt;System.Threading.Channels&lt;/code&gt;, dependency injection, etc.). It’s ideal for scenarios where you need lightweight queueing in a single application instance (with the usual caveats). 👇&lt;/p&gt;

&lt;h3&gt;
  
  
  What you’ll learn
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;How to define a &lt;code&gt;IBackgroundTaskQueue&lt;/code&gt; interface&lt;/li&gt;
&lt;li&gt;Implementing it using &lt;code&gt;Channel&amp;lt;T&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Creating a &lt;code&gt;BackgroundService&lt;/code&gt; that continuously dequeues and executes jobs&lt;/li&gt;
&lt;li&gt;Wiring it into the ASP.NET Core DI container&lt;/li&gt;
&lt;li&gt;Pitfalls and limitations of an in memory approach (e.g. job loss upon restart, scalability)&lt;/li&gt;
&lt;li&gt;When to switch to more robust solutions (Hangfire, message brokers)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you like hands on, from scratch tutorials, here’s the full article:&lt;br&gt;
&lt;a href="https://abp.io/community/articles/how-to-build-an-in-memory-background-job-queue-in-asp.net-core-from-scratch-pai2zmtr" rel="noopener noreferrer"&gt;How to Build an In Memory Background Job Queue in ASP.NET Core from Scratch&lt;/a&gt;&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
