<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Let's Pretend I know This Blog</title>
        <link>https://letspretend.netlify.app/blog</link>
        <description>Let's Pretend I know This Blog</description>
        <lastBuildDate>Sat, 25 Jan 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Run SQL script on Postgres Container Creating.]]></title>
            <link>https://letspretend.netlify.app/blog/run-postgres-script-on-init</link>
            <guid>https://letspretend.netlify.app/blog/run-postgres-script-on-init</guid>
            <pubDate>Sat, 25 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Hello there! On this post we are going to see how we can run an SQL initial script when starting up a Postgres image.]]></description>
            <content:encoded><![CDATA[<p>Hello there! On this post we are going to see how we can run an SQL initial script when starting up a Postgres image.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="topics">Topics<a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#topics" class="hash-link" aria-label="Direct link to Topics" title="Direct link to Topics">​</a></h2>
<ul>
<li><a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#problem-description">Problem Description</a></li>
<li><a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#dockerfile-and-sql-script">Dockerfile and SQL script</a></li>
<li><a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#build-and-run">Build and Run</a></li>
<li><a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#validate-the-table-exits-exec">Validate the table is there exec</a></li>
<li><a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#conclusion">Conclusion</a></li>
</ul>
<p>This blog post won't go through what <a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer">Docker</a> or containerization is, and all images are pulled from <a href="https://www.hub.docker.com/" target="_blank" rel="noopener noreferrer">DockerHub</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="problem-description">Problem Description<a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#problem-description" class="hash-link" aria-label="Direct link to Problem Description" title="Direct link to Problem Description">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="some-context">Some Context<a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#some-context" class="hash-link" aria-label="Direct link to Some Context" title="Direct link to Some Context">​</a></h3>
<p>I was recently working on a side project in an attempt to learn a new language and I wanted to build a simple REST API with the language.<br>
<!-- -->I wanted to use <a href="https://www.postgresql.org/" target="_blank" rel="noopener noreferrer">PostgresSQL</a> as my SQL database. I was to using the <a href="https://hub.docker.com/_/postgres" target="_blank" rel="noopener noreferrer">Postgres Docker image</a> to achieve this.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-problem">The Problem<a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem">​</a></h3>
<p>Then I had a problem: <strong>How can I create tables on container creation so I don't need to manually create tables in the running container</strong> because that would want me to use: <code>docker exec -it &lt;Postgres-Container-ID&gt; sh</code> so I can open the container's shell to do this:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">manual postgres shell</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"># In postgres docker conatiner:</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">psql -U postgres # connect to postgres cli as default user postgres.</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">#  result of psql -U postgres:</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">postgres=# </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"># manually write postgres queries here...</span><br></span></code></pre></div></div>
<p>This would've meant everytime I remove the postgres container with a command like <code>docker rm &lt;postgres-container-id&gt;</code> then I will always need to do the creation of my tables AGAIN!! That isn't ideal.</p>
<p>Lucky for me, the Docker postgres image has a way to run a script on initial creation of the container. Let's see how we can use that to at least always create a container with the desired database tables.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The initial run script gets run once when the container is created for the 1st time.<br>
<!-- -->This means if we update the script we would need to remove/delete the container and rebuild our Dockerfile.<br>
<!-- -->This isn't ideal for production but good enough for playing around projects.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="dockerfile-and-sql-script">Dockerfile and SQL script.<a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#dockerfile-and-sql-script" class="hash-link" aria-label="Direct link to Dockerfile and SQL script." title="Direct link to Dockerfile and SQL script.">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-dockerfile">The Dockerfile<a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#the-dockerfile" class="hash-link" aria-label="Direct link to The Dockerfile" title="Direct link to The Dockerfile">​</a></h3>
<p>The Dockerfile we are going to use will be using the Postgres image from DockerHub as the base image and will look like this:</p>
<div class="language-dockerfile codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">Dockerfile</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">FROM postgres:latest</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"># populate database and password arguments so we don't use the default values.</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">ENV POSTGRES_DB=initdb</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">ENV POSTGRES_PASSWORD=initpassword</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"># copying the sql script into docker-entrypoint-initdb.d to be run when the container is created. </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">COPY ./scripts/create-initial-tables-if-not-exists.sql /docker-entrypoint-initdb.d/</span><br></span></code></pre></div></div>
<p>The <code>COPY</code> instruction is where we copy our script into the image we are building. This will take our sql into the <code>docker-entrypoint-initdb.d</code> directory.<br>
<!-- -->That is the directory which will be inspected on container initial creation.</p>
<p>The environment variables <code>POSTGRES_DB</code> and <code>POSTGRES_PASSWORD</code> will be used by postgres to:</p>
<ul>
<li>Create a database called initdb (default database is postgres)</li>
<li>Create a password for the default user in postgres called <code>postgres</code>.</li>
</ul>
<p>So we are essentially just overriding default values here. You can read up about the default environment variables and what they imply <a href="https://hub.docker.com/_/postgres" target="_blank" rel="noopener noreferrer">here</a></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-sql-script">The SQL script<a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#the-sql-script" class="hash-link" aria-label="Direct link to The SQL script" title="Direct link to The SQL script">​</a></h3>
<p>You can store this SQL script anywhere, as long as your Dockerfile will be able to access it. I store mine in the root where I have my Dockerfile.<br>
<!-- -->It's in a directory that I chose to call <code>scripts</code>, this can be any name you like.</p>
<p>The script looks like this:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">create-initial-tables-if-not-exists.sql</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">-- connect to initdb that will be created by our Dockerfile</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">\c initdb</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">-- Create init_user table in the initdb database</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">TABLE</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">IF</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">NOT</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">EXISTS</span><span class="token plain"> init_user </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    id UUID </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">PRIMARY</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">KEY</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">DEFAULT</span><span class="token plain"> gen_random_uuid</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    firstname </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">VARCHAR</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token number" style="color:hsl(35, 99%, 36%)">255</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(35, 99%, 36%)">NULL</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    surname </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">TEXT</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(35, 99%, 36%)">NULL</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    created_at </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">TIMESTAMP</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">DEFAULT</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">CURRENT_TIMESTAMP</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>The script connects to the <code>initdb</code> database using <code>\c initdb</code> the command <code>\c</code> is a Postgres command to connect to a database.
We then create a simple <code>init_user</code> table in the database named <code>initdb</code> that we specified as the <code>POSTGRES_DB</code> environment variable.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="build-and-run">Build and Run<a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#build-and-run" class="hash-link" aria-label="Direct link to Build and Run" title="Direct link to Build and Run">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="building-the-image">Building the image<a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#building-the-image" class="hash-link" aria-label="Direct link to Building the image" title="Direct link to Building the image">​</a></h3>
<p>To build our Dockerfile we simply go:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">build dockerfile</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"># build dockerfile (assuming the shell is open in the same directory as the Dockerfile):</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">docker build .</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"># tag image for ease of reading </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">docker tag &lt;built-image-id&gt; localhost/init_postgres</span><br></span></code></pre></div></div>
<p>You can find the <code>built-image-id</code> by running <code>docker images</code> and then copying the latest built image.<br>
<!-- -->Now that the image is built, we can then use it to create a container i.e. an instance of the image.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="running-the-image-creating-the-container">Running the Image (Creating the container):<a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#running-the-image-creating-the-container" class="hash-link" aria-label="Direct link to Running the Image (Creating the container):" title="Direct link to Running the Image (Creating the container):">​</a></h3>
<p>To run the container it's as simple as doing a <code>docker run</code>, here's how:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">run docker image</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"># docker run will create a new container from this built image</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">docker run localhost/init_postgres</span><br></span></code></pre></div></div>
<p>This will create your container and you will see postgres logs. Then look for log lines like these:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">docker run output</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">server started</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">CREATE DATABASE</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/create-initial-tables-if-not-exists.sql</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">You are now connected to database "initdb" as user "postgres".</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">CREATE TABLE</span><br></span></code></pre></div></div>
<p>From these lines we can see that we connected to the <code>initdb</code> database as the default user (postgres).<br>
<!-- -->Another cool thing is we can see the line:<br>
<code>/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/create-initial-tables-if-not-exists.sql</code><br>
<!-- -->which validates that our script is ran.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="validate-the-table-exits-exec">Validate the table exits (exec).<a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#validate-the-table-exits-exec" class="hash-link" aria-label="Direct link to Validate the table exits (exec)." title="Direct link to Validate the table exits (exec).">​</a></h2>
<p>At this point we can rest assured that our database is created but how do we validate? We can <code>exec</code> into the running container.<br>
<!-- -->To <code>exec</code> into the container allows us to go into the running container and do some tasks like checking logs, filesystem and even run some Postgres CLI commands.</p>
<p>First we need to get the created container's id by running: <code>docker ps</code> then we can see something like this:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">output of docker ps</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">CONTAINER ID   IMAGE                     COMMAND                  CREATED         STATUS         PORTS      NAMES</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">496a74be5e61   localhost/init_postgres   "docker-entrypoint.s…"   7 minutes ago   Up 7 minutes   5432/tcp   loving_leavitt</span><br></span></code></pre></div></div>
<p>Then copy the the <code>CONTAINER ID</code> then run the exec command: <code>docker exec -it 496a74be5e61 sh</code>. This opens a shell/terminal in the container we then need.<br>
<!-- -->After this we will be in the container, then we need to login as the default user (postres) to the Postgres CLI in the container using the command: <code>psql -U postgres</code></p>
<p>This will open a CLI with a prefix: <code>postgres=#</code> then we can run the following commands to connect and view the table</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">terminal in the container</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"># connect to the initdb database</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">postgres=# \c initdb</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"># list all tables:</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">postgres=# \dt</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"># result of the table list operation:</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">           List of relations</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"> Schema |   Name    | Type  |  Owner   </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">--------+-----------+-------+----------</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"> public | init_user | table | postgres</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">(1 row)</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>From here we can see that the table was created and we can work with it however we want. You can type <code>exit</code> into your terminal until you exit both postgres CLI and the container's shell.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>After you are done playing around clean up by deleting uneeded images and containers. I usually go:</p><ul>
<li>stop running container: <code>sudo docker stop loving_leavitt</code> =&gt; I got loving_leavit from <code>NAMES</code> prop of docker ps result</li>
<li>delete all conatiners: <code>sudo docker rm $(sudo docker ps -aq)</code>=&gt; This deletes all containers. You can just remove yours if you still have containers you want keep.</li>
<li>delete uneeded image: <code>sudo docker rmi localhost/init_postgres</code> =&gt; deletes the image we built. We can always build it back if we need it.</li>
</ul></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion.<a href="https://letspretend.netlify.app/blog/run-postgres-script-on-init#conclusion" class="hash-link" aria-label="Direct link to Conclusion." title="Direct link to Conclusion.">​</a></h2>
<p>On this blog post we pretended to understand how we can use the Postgres docker image to create tables on initial creation of a container.<br>
<!-- -->This is helpful for situation where we want to create a table every time we want create a container and we don't want to do it manually.<br>
<strong>REMINDER: THIS IS USEFUL FOR PLAYING AROUND PROJECTS OR LOCAL INSTANCES FOR LOCAL DEVELOPMENT</strong> as it doesn't scale.<br>
<!-- -->If we add more tables or columns we will need to rebuild and re-run the image thus lossing data that we already have in the database container.</p>
<p>With that being said, keep pretending until you are not, until the next time!</p>]]></content:encoded>
            <category>Docker</category>
            <category>Postgres</category>
            <category>Containers</category>
            <category>Images</category>
            <category>Unix</category>
        </item>
        <item>
            <title><![CDATA[UseEffect Infinite Loop]]></title>
            <link>https://letspretend.netlify.app/blog/use-effect-infinite-loop</link>
            <guid>https://letspretend.netlify.app/blog/use-effect-infinite-loop</guid>
            <pubDate>Tue, 30 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Hello there! On this blog post we are going to have a brief talk about React's UseEffect Hook and some silly thing I have done that caused the UseEffect to keep calling my setup even though my dependency didn't change, or at least I thought.]]></description>
            <content:encoded><![CDATA[<p>Hello there! On this blog post we are going to have a brief talk about React's UseEffect Hook and some silly thing I have done that caused the UseEffect to keep calling my setup even though my dependency didn't change, or at least I thought.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="topics">Topics<a href="https://letspretend.netlify.app/blog/use-effect-infinite-loop#topics" class="hash-link" aria-label="Direct link to Topics" title="Direct link to Topics">​</a></h2>
<ul>
<li><a href="https://letspretend.netlify.app/blog/use-effect-infinite-loop#brief-explanation-of-the-useeffect-hook">Brief explanation of the useEffect Hook</a></li>
<li><a href="https://letspretend.netlify.app/blog/use-effect-infinite-loop#a-word-on-dependencies-array">A word on dependencies array</a></li>
<li><a href="https://letspretend.netlify.app/blog/use-effect-infinite-loop#my-silly-error">My Silly Error</a></li>
</ul>
<p>Before we dive into the details I would like to say React has a <a href="https://react.dev/reference/react/useEffect" target="_blank" rel="noopener noreferrer">good documentation on the UseEffect hook</a>, I'd recommend that as a source of learning about the hook, here I will be just focusing on the error I made so then enjoy, you beautiful reader!</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="brief-explanation-of-the-useeffect-hook">Brief explanation of the useEffect Hook<a href="https://letspretend.netlify.app/blog/use-effect-infinite-loop#brief-explanation-of-the-useeffect-hook" class="hash-link" aria-label="Direct link to Brief explanation of the useEffect Hook" title="Direct link to Brief explanation of the useEffect Hook">​</a></h2>
<p>The <code>useEffect(setup, dependencies)</code> function is a <a href="https://react.dev/reference/react/hooks" target="_blank" rel="noopener noreferrer">React hook</a>, a hook is a React function that allows you to use React features like state where you want to store the state of a certain variable on every re-render of a component. The useEffect is used to reach out to external services from our React component.</p>
<p>A good example would be to get data from a REST API so we can display in our component, other tasks would be to do some operations on a file system which is external to our React app, something like reading a file.</p>
<p>The React useEffect hook is called within the body of a React component or custom hook we defined, it has two arguments <code>setup</code> and <code>dependencies</code>. The setup is a function we pass that will be called when our useEffect is triggered. The dependencies is an array of dependencies, can be ignore, empty or have a known list of dependencies.</p>
<p>A simple example of the react useEffect in action would look like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">simple-react-snippet-using-useEffect</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">myReactComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">props</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">useEffect</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//set up method</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//call api, go to file system, reach out to the DOM</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">div</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">Some</span><span class="token plain"> </span><span class="token maybe-class-name">Content</span><span class="token plain"> here</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">div</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>We can also optionally return a clean up function in our useEffect hook, a clean up method is a method that is called after the set up is done doing it's task. A clean up function can be used like so:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">simple-react-snippet-using-useEffect-with-cleanup</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">myReactComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">props</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">useEffect</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//set up method</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//call api, go to file system, reach out to the DOM</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//body of clean-up</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//do some clean up like closing connections etc.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">div</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">Some</span><span class="token plain"> </span><span class="token maybe-class-name">Content</span><span class="token plain"> here</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">div</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>For more info about the clean up method please refer to the <a href="https://react.dev/reference/react" target="_blank" rel="noopener noreferrer">React docs</a>, I don't want to dwell on it here, so sorry. Something I want us to dwell in is the <code>dependencies</code> array argument that I have purposefully left of the convo.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-word-on-dependencies-array">A word on dependencies array<a href="https://letspretend.netlify.app/blog/use-effect-infinite-loop#a-word-on-dependencies-array" class="hash-link" aria-label="Direct link to A word on dependencies array" title="Direct link to A word on dependencies array">​</a></h2>
<p>The dependencies array is an optional parameter we pass along with the setup function in the <code>useEffect</code> function. The array lists the dependencies that will cause the useEffect to be called when they change, there are some cases that cause the useEffect to behave a certain way, the cases are as follows:</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="no-dependencies-specified">No dependencies specified:<a href="https://letspretend.netlify.app/blog/use-effect-infinite-loop#no-dependencies-specified" class="hash-link" aria-label="Direct link to No dependencies specified:" title="Direct link to No dependencies specified:">​</a></h3>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">myReactComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">props</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">useEffect</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//set up method</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//call api, go to file system, reach out to the DOM</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//body of clean-up</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// no dependencies array</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">div</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">Some</span><span class="token plain"> </span><span class="token maybe-class-name">Content</span><span class="token plain"> here</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">div</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>When no dependencies are specified this tells React to call the useEffect on every re-render that happens in the component, re-renders are consequence of state changes or page reloads, state variables are specified with <a href="https://react.dev/reference/react/useState" target="_blank" rel="noopener noreferrer">useState()</a> which I won't dwell on here. This is desirable if you want useEffect to be called when any of state varibales changes for whatever reason.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="empty-dependencies-array">Empty dependencies array<a href="https://letspretend.netlify.app/blog/use-effect-infinite-loop#empty-dependencies-array" class="hash-link" aria-label="Direct link to Empty dependencies array" title="Direct link to Empty dependencies array">​</a></h3>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">myReactComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">props</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">useEffect</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//set up method</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//call api, go to file system, reach out to the DOM</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//body of clean-up</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//empty array</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">div</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">Some</span><span class="token plain"> </span><span class="token maybe-class-name">Content</span><span class="token plain"> here</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">div</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>When an empty array is passed this tells React to run the useEffect after initial render of the component and never again, this is ideal for situations where we want to do some <strong>external task</strong> on initial load of the component then never again, like fetching a file once when the component comes up on the screen and never wanting to fetch the file ever again until we remove the component from the view.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="specifying-dependencies">Specifying dependencies<a href="https://letspretend.netlify.app/blog/use-effect-infinite-loop#specifying-dependencies" class="hash-link" aria-label="Direct link to Specifying dependencies" title="Direct link to Specifying dependencies">​</a></h3>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">myReactComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">props</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token plain">message</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> setMessage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">useState</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">''</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> otherMessage </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">''</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">useEffect</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//set up method</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//call api to save message to db</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//body of clean-up</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token plain">message</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> otherMessage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//dependency</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//some code that potentially changes the message or otherMessage variables</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">div</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">Some</span><span class="token plain"> </span><span class="token maybe-class-name">Content</span><span class="token plain"> here</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">div</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>When a dependency is specified this tells React that when this value changes run the code in the useEffect, the useEffect will run once after initial render and again unless the <code>message</code> state or <code>otherMessage</code> variable changes.</p>
<p>If you look carefully I have two dependencies, <code>message</code> and <code>otherMessage</code>, this is to drive an important point, variables that are defined within the component body including props are called reactive variables and are the only objects/variables that can be dependencies to a useEffect, please see <a href="https://react.dev/learn/lifecycle-of-reactive-effects#effects-react-to-reactive-values" target="_blank" rel="noopener noreferrer">this</a> for more info.</p>
<p>This final case is the reason I did my silly mistake. Let's see how.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="my-silly-error">My Silly Error<a href="https://letspretend.netlify.app/blog/use-effect-infinite-loop#my-silly-error" class="hash-link" aria-label="Direct link to My Silly Error" title="Direct link to My Silly Error">​</a></h2>
<p>If we refer to the <a href="https://letspretend.netlify.app/blog/use-effect-infinite-loop#specifying-dependencies">previous case</a> above we can see that: <em>When a dependency is specified this tells React that when this value changes run the code in the useEffect</em>.</p>
<p>My mistake was I had a state variable which I set as a dependency that got set by the setup code in the useEffact on initial render of the app, after the setup changed my state variable then the useEffect detacted a change on the dependency then called the setup, which caused a change on the dependency again, and the useEffect detected another change and so on and so on.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="a-little-diagram-to-help">A little Diagram To Help<a href="https://letspretend.netlify.app/blog/use-effect-infinite-loop#a-little-diagram-to-help" class="hash-link" aria-label="Direct link to A little Diagram To Help" title="Direct link to A little Diagram To Help">​</a></h3>
<p>The below diagram shows the high level of how the error works:
<img decoding="async" loading="lazy" alt="useeffect-infite-loop-diagram" src="https://letspretend.netlify.app/assets/images/useEffect-infite-loop-diagram-37c430c335eb6269f434f840972d6aae.png" width="423" height="366" class="img_ev3q"></p>
<p>To explain what is happening here:</p>
<ul>
<li>First I created a state variable and initialized it as an empty array.</li>
<li>Then I set it as a dependency is my useEffect(), so if this state variable changed, the useEffect will be called.</li>
<li>The useEffect has a setup method that changes the state variable's value (<strong>this is the bug btw</strong>. I indicated the change here by showing an array with values 1,2, and 3).</li>
<li>After the initial change, my useEffect realized; <strong><em>"hey the dependency has changed, let me call the setup again!"</em></strong>. The setup changed the var again and useEffect was like: <strong><em>"okay I need to call the setup again!"</em></strong>. This continued nonstop and thus the infinite loop 😂</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>The resolution to this issue was to remove the state variable from the dependecy array, as I needed it to be populated on initial render only.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://letspretend.netlify.app/blog/use-effect-infinite-loop#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>React offers some useful functions called hooks that allow us to use some React's useful features like state. The useEffect hook is one of those hooks which allows us to do some external tasks that we can't normally do from our React component's code, this includes and not limited to: calling a remote service, reaching out to the DOM, reading a file system. The useEffect uses normal JavaScript/TypeScript code inside it's setup to do tasks.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>A key takeaway would be to avoid changing your dependency from within your setup function. Doing so will cause the <code>useEffect</code> to call the setup function repeatedly, leading to an infinite loop.</p></div></div>]]></content:encoded>
            <category>React</category>
            <category>FrontEnd</category>
            <category>UI</category>
            <category>API</category>
            <category>Hooks</category>
            <category>UseEffect</category>
        </item>
        <item>
            <title><![CDATA[Configuration Set Up For A .NET App]]></title>
            <link>https://letspretend.netlify.app/blog/config-set-up-dotnet</link>
            <guid>https://letspretend.netlify.app/blog/config-set-up-dotnet</guid>
            <pubDate>Mon, 17 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Hello there! On this blog post we are going to look at different ways to read the configuration into your application and what each method implies.]]></description>
            <content:encoded><![CDATA[<p>Hello there! On this blog post we are going to look at different ways to read the configuration into your application and what each method implies.<br>
<!-- -->In the blog post will just be using the appsettings.json as our configuration provider.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="topics">Topics<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#topics" class="hash-link" aria-label="Direct link to Topics" title="Direct link to Topics">​</a></h2>
<ul>
<li><a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#reading-the-configuration-bind-configure-and-configurationstring-value">Reading the Configuration (Bind, Configure and Configuration[string-value])</a></li>
<li><a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#the-webapi-for-testing">The WebAPI For Testing</a></li>
<li><a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#how-each-method-handle-changes">How Each Method Handle Changes.</a></li>
<li><a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#what-to-use">What to use?</a></li>
<li><a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#conclusion">Conclusion</a></li>
</ul>
<p>All code referenced in this blog post can be found <a href="https://github.com/Takobz/config-testing/" target="_blank" rel="noopener noreferrer">here</a>.
Microsoft has good documentation on this which can be found <a href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options/" target="_blank" rel="noopener noreferrer">here</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="reading-the-configuration-bind-configure-and-configurationstring-value">Reading the Configuration (Bind, Configure and Configuration[string-value])<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#reading-the-configuration-bind-configure-and-configurationstring-value" class="hash-link" aria-label="Direct link to Reading the Configuration (Bind, Configure and Configuration[string-value])" title="Direct link to Reading the Configuration (Bind, Configure and Configuration[string-value])">​</a></h2>
<p>In this section we will look at different ways we can read in the configuration into a .NET Application.
The following code snippets assumes we have an appsetting.json file with this <code>Secrets:SecretA</code> structure, as seen below:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">appsettings.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token property" style="color:hsl(5, 74%, 59%)">"Secrets"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token property" style="color:hsl(5, 74%, 59%)">"SecretA"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token string" style="color:hsl(119, 34%, 47%)">"someValue"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token property" style="color:hsl(5, 74%, 59%)">"Key"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Value"</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>We also assume we have a C# class with that structure for binding purposes, as seen below:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">SecretsOptions.cs</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">namespace </span><span class="token maybe-class-name">ConfigTesting</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Models</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    #pragma warning disable </span><span class="token constant" style="color:hsl(35, 99%, 36%)">CS8618</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">SecretsOptions</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> string </span><span class="token maybe-class-name">Secrets</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"Secrets"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">SecretA</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="bind-method">Bind Method<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#bind-method" class="hash-link" aria-label="Direct link to Bind Method" title="Direct link to Bind Method">​</a></h4>
<p>With the bind method, we get the section we want from the loaded configuration (in our case the appsettings.json) then we bind that section to an instance of a class that we have created ourselves. For the binding to work the corresponding properties in the class need to have public getter and setter as seen above for <code>SecretsOptions</code> class.</p>
<p>This is how we can bind:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//assuming configuration is IConfiguration which we can access via DI or builder.Configuration</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//.NET must have loaded the appsettings.json file by default for us.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//we create an instance then bind it to values in the configuration</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> secretsOptions </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">SecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">configuration</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">GetSection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">SecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Secrets</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Bind</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">secretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//this will give out the current SecretA value, the one we had at the time of binding</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">secretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">SecretA</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>Things to note here are:</p>
<ul>
<li>This gets the current loaded configuration and binds values to the class</li>
<li>If the <code>IConfiguration</code> updates values the <code>secretOptions</code> <strong>WILL NOT</strong> update.</li>
<li>This method can be used anywhere in the application where we can have access to IConfiguration.</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="configuretoption-method">Configure&lt;TOption&gt; Method<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#configuretoption-method" class="hash-link" aria-label="Direct link to Configure<TOption> Method" title="Direct link to Configure<TOption> Method">​</a></h4>
<p>The <code>TOption</code> generic class in this instance is our class that represents the settings i.e. <code>SecretsOptions</code> class.<br>
<!-- -->With this method we still need to get the section from the configuration but we don't need to bind to any instance as we will be accessing our settings via Dependency Injection.</p>
<p>This is how we read in the config:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">// This allow us to get the configuration via the IOptions&lt;TOption&gt;, IOptionsMonitor&lt;TOption&gt;, or IOptionsSnapshot&lt;TOption&gt; interfaces</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">// This adds our options to the DI container</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">configuration</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">GetSection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">SecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Secrets</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Configure</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">SecretsOptions</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Example of usage in other class</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">SomeClass</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">private</span><span class="token plain"> readonly _secretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">SomeClass</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter maybe-class-name">IOptions</span><span class="token parameter operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token parameter maybe-class-name">SecretsOptions</span><span class="token parameter operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token parameter"> options</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        _secretsOptions </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> options</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Value</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">??</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">throw</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">ArgumentNullException</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token function" style="color:hsl(221, 87%, 60%)">nameof</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">options</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//usage later in the code</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//This will give us the value of SecretA that was loaded from the configuration when IOptions was constructed.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//The IOption is constructed into the DI container as a singleton, more on this later.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    _secretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">SecretA</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>Things to note here are:</p>
<ul>
<li>This method adds our configuration section to the DI container.</li>
<li>It allows us to get our section with the class <code>IOptions</code>, <code>IOptionsMonitor</code>, or <code>IOptionsSnapshot</code></li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="configurationstring-value">Configuration[string-value]<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#configurationstring-value" class="hash-link" aria-label="Direct link to Configuration[string-value]" title="Direct link to Configuration[string-value]">​</a></h4>
<p>Another note worthy method of reading the configuration is using the configuration itself. This works for the IConfiguration which can be accessed via DI.
.NET Automatically adds the loaded Configuration into the DI container.</p>
<p>This method always get the most recent values from our configuration. When using this method you will get back a string. Using our example json below:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token property" style="color:hsl(5, 74%, 59%)">"Secrets"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token property" style="color:hsl(5, 74%, 59%)">"SecretA"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token string" style="color:hsl(119, 34%, 47%)">"someValue"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token property" style="color:hsl(5, 74%, 59%)">"Key"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Value"</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>Assuming I have IConfiguration as a variable then if I go: <code>config["Secrets"]</code> this will return null since Secrets section is not parsable to a string, but <code>config["Key"]</code> we will get value <code>Value</code> since it is parsable to a string.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>To get the whole Secrets section from the configuration you can use <code>GetSection()</code>.</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token maybe-class-name">IConfigurationSection</span><span class="token plain"> secretsSection </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">GetSection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Secrets"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//To access values in the section:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//secretA will have a value if SecretA is parsable as a string.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> secretA </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> secretsSection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token string" style="color:hsl(119, 34%, 47%)">"SecretA"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//will have someValue string</span><br></span></code></pre></div></div></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Primitive values that can be parsed to strings are <code>int</code>, <code>double</code>, <code>decimal</code>, <code>char</code>, <code>bool</code>, and <code>string</code>.
The IConfiguration["some-section"] returns null if it can't parse the section, which likely happens if the section is a complex json object, to which using <code>GetSection("some-section")</code> is most appropriate.</p></div></div>
<p>So as we can see .NET offers a bunch of options for getting your configuration values from the IConfiguration. Now let's look at how each method handles the changes in the configuration.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-webapi-for-testing">The WebAPI For Testing<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#the-webapi-for-testing" class="hash-link" aria-label="Direct link to The WebAPI For Testing" title="Direct link to The WebAPI For Testing">​</a></h2>
<p>In this section we are going to see how a simple miminal API can help look at how each of the methods handle changes that might happen to the IConfiguration. Knowing when your configuration changes is important to applications that might have a configuration provider that changes value, like auto rotated secrets in a key vault.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="configuration-providers">Configuration Providers<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#configuration-providers" class="hash-link" aria-label="Direct link to Configuration Providers" title="Direct link to Configuration Providers">​</a></h4>
<p>One cool thing about .NET's IConfiguration is that it can have multiple providers at the same time. To understand what I mean about providers let's look at this diagram:
<img decoding="async" loading="lazy" src="https://letspretend.netlify.app/assets/images/multi-config-providers-6a3448edf55419c1d4da0b075242cd6d.png" width="622" height="298" class="img_ev3q"></p>
<p>The diagram shows that a .NET Application can construct a configuration from multiple sources, like <code>appsettings.json</code>, <code>customsettings.json</code>, and some external service like a <a href="https://learn.microsoft.com/en-us/azure/key-vault/general/basic-concepts" target="_blank" rel="noopener noreferrer">keyvault</a>. We can have as many providers as we want.</p>
<p>These different sources are what we call <code>configuration providers</code>, because they provide values to our configuration. Multiple configurations can be added to our IConfiguration in different ways. The appsettings.json will be added automitically by .NET unless told otherwise.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>For more information on how configuration is loaded in a .NET application, please see this <a href="https://learn.microsoft.com/en-us/dotnet/core/extensions/configuration-providers" target="_blank" rel="noopener noreferrer">documentation</a>.</p></div></div>
<p>The reason we spoke about configuration providers it's because I wanted to chip in something like keyvault into the conversation, but why? Well because providers like keyvault tend to have values that can change and our application might need to use the latest value and hence we need to have means to be alerted of our the changes so that our application uses the lastest and freshest settings.</p>
<p>Now let's look at our application that will help us test out which method is best for listening to changes in our configuration.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="the-configuration-api">The Configuration API.<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#the-configuration-api" class="hash-link" aria-label="Direct link to The Configuration API." title="Direct link to The Configuration API.">​</a></h4>
<p>The code to this api can be found <a href="https://github.com/link-to-app" target="_blank" rel="noopener noreferrer">here</a>. Please note the only provider used in this application is the appsetting.json for the sake of simplicity.</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="what-the-webapi-does">What the WebAPI Does<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#what-the-webapi-does" class="hash-link" aria-label="Direct link to What the WebAPI Does" title="Direct link to What the WebAPI Does">​</a></h5>
<p>The WebAPI provides an endpoint to change a value of a section in the <code>appsettings.json</code>, the value is <code>Secrets:SecretA</code> as seen in the JSON file below:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token property" style="color:hsl(5, 74%, 59%)">"Logging"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token property" style="color:hsl(5, 74%, 59%)">"LogLevel"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token property" style="color:hsl(5, 74%, 59%)">"Default"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"Information"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token property" style="color:hsl(5, 74%, 59%)">"Microsoft.AspNetCore"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"Warning"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token property" style="color:hsl(5, 74%, 59%)">"SettingA"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"initValue"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token property" style="color:hsl(5, 74%, 59%)">"Secrets"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token property" style="color:hsl(5, 74%, 59%)">"SecretA"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"a-very-secret-value"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token property" style="color:hsl(5, 74%, 59%)">"Key"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">1</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token property" style="color:hsl(5, 74%, 59%)">"AllowedHosts"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"*"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>The API will be able to update the SecretA value to any value provided.<br>
<!-- -->The Web API also has another endpoint to get the current value of <code>SecretA</code></p>
<p>The endpoint to update the config value returns a result like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> record </span><span class="token maybe-class-name">ConfigChangeResponse</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">/// &lt;summary&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">/// The value before the IConfiguration changed</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">/// &lt;/summary&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">OldValue</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> init</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">/// &lt;summary&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">/// The value after the IConfiguration changed</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">/// &lt;/summary&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">NewValue</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> init</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">/// &lt;summary&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">/// The value of the binded property before the IConfiguration changed</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">/// &lt;/summary&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">BindBeforeChange</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> init</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">/// &lt;summary&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">/// The value of the binded property after the IConfiguration changed</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">/// &lt;/summary&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">BindAfterChange</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> init</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>Each property value is explained in the summary comments of the class as seen above. The <code>BindBeforeChange</code> and <code>BindAfterChange</code> will be the properties that will have values before and after the change of the configuration respectively, this will help us see how each binding method mentioned above handles changes.</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="how-the-webapi-updates-the-iconfiguration">How the WebAPI updates the IConfiguration<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#how-the-webapi-updates-the-iconfiguration" class="hash-link" aria-label="Direct link to How the WebAPI updates the IConfiguration" title="Direct link to How the WebAPI updates the IConfiguration">​</a></h5>
<p>I have a class I wrote called <a href="https://github.com/Takobz/config-testing/blob/main/Helper/IUpdateAppSettings.cs" target="_blank" rel="noopener noreferrer">ConfigurationUpdater</a>. Which looks like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">UpdateAppSettings</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">string section</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"> string key</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"> string newValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> json </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token maybe-class-name">File</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">ReadAllText</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">_filePath</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> jsonObj </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token maybe-class-name">JObject</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Parse</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">json</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">jsonObj</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">SelectToken</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">section</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> is </span><span class="token maybe-class-name">JObject</span><span class="token plain"> sectionToken</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        sectionToken</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token plain">key</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> newValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token maybe-class-name">File</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">WriteAllText</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">_filePath</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> jsonObj</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">ToString</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Reloads the IConfiguration in the application's DI container</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Every class using the IConfiguration will reload the configuration</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        _configRoot</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Reload</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">else</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">throw</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">ArgumentException</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">$</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Section '{section}' not found in configuration."</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>The above code just updates a said value on a section. Then reloads the configuration so that any class using the passed IConfigurationRoot can have the reloaded configuration. This is how the class can be used:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">updater</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UpdateAppSettings</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Secrets"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"SecretA"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"someValue"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>In all, the ConfigurationUpdater class is for updating the IConfiguration. I just wanted to discuss how it does that, nothing fancy. Please see <a href="https://github.com/Takobz/config-testing/blob/b318f442474389a4e66c8126770109e609572873/Program.cs#L54C5-L54C63" target="_blank" rel="noopener noreferrer">this</a> for usage, and <a href="https://github.com/Takobz/config-testing/blob/b318f442474389a4e66c8126770109e609572873/Program.cs#L17C1-L20C4" target="_blank" rel="noopener noreferrer">this</a> on how the service is registered into the application's DI container.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>The <code>IConfigurationRoot</code> is an implementation of the <code>IConfiguration</code> that offers a Reload method to reload the configuration. The UpdateConfiguration class injects the IConfiguration via DI which is the configuration the whole app uses, any change to it will affect any class using the configuration.</p></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="the-update-endpoint">The Update Endpoint<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#the-update-endpoint" class="hash-link" aria-label="Direct link to The Update Endpoint" title="Direct link to The Update Endpoint">​</a></h5>
<p>The Update method does a few steps to help us test how each method behaves for, here is the code and sequence:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">MapPut</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"/updateconfig/{newValue}"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token parameter">string newValue</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token parameter">     </span><span class="token parameter maybe-class-name">IOptionsMonitor</span><span class="token parameter operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token parameter maybe-class-name">SecretsOptions</span><span class="token parameter operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token parameter"> secretsOptionsMonitor</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token parameter">     </span><span class="token parameter maybe-class-name">IConfiguration</span><span class="token parameter"> config</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token parameter">     </span><span class="token parameter maybe-class-name">IConfigurationUpdater</span><span class="token parameter"> updater</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Bind section to the SecretsOptions class</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token maybe-class-name">IConfigurationSection</span><span class="token plain"> section </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">GetSection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">SecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Secrets</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> secretsOptions </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">SecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    section</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Bind</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">secretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// Get the current value from the binded property</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> bindBeforeChange </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> secretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">SecretA</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// Get the current value from the configuration</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> oldConfigValue </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Secrets:SecretA"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// Update the configuration</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    updater</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UpdateAppSettings</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Secrets"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"SecretA"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> newValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// Get the new value from the configuration</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> newConfigValue </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Secrets:SecretA"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// Get the new value from the binded property</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> bindAfterChange </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> secretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">SecretA</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">oldConfigValue </span><span class="token operator" style="color:hsl(221, 87%, 60%)">==</span><span class="token plain"> newConfigValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token maybe-class-name">Results</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">BadRequest</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Failed to update configuration"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token maybe-class-name">Results</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Ok</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">ConfigChangeResponse</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token maybe-class-name">OldValue</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> oldConfigValue </span><span class="token operator" style="color:hsl(221, 87%, 60%)">??</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token maybe-class-name">NewValue</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> newConfigValue </span><span class="token operator" style="color:hsl(221, 87%, 60%)">??</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token maybe-class-name">BindBeforeChange</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> bindBeforeChange </span><span class="token operator" style="color:hsl(221, 87%, 60%)">??</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token maybe-class-name">BindAfterChange</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> bindAfterChange </span><span class="token operator" style="color:hsl(221, 87%, 60%)">??</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">WithName</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"ConfigUpdater"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">WithOpenApi</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>Sequence:</p>
<ul>
<li>Binds the SecretsOptions class using a specific method, in the above example we used the Bind().</li>
<li>We read what is binded into the SecretsOptions class' SecretA value.</li>
<li>We then follow by reading the SecretA value straight from IConfiguration, this will be the same as the step above's value.</li>
<li>After this we update the IConfiguration with the new value.</li>
<li>We then get the new value from the IConfiguration, this should be the updated value.</li>
<li>After we read the binded SecretsOptions class' SecretA value.</li>
<li>Finally, we return the appropriate class with 4 values as explain in this <a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#what-the-webapi-does">section</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-each-method-handle-changes">How Each Method Handle Changes.<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#how-each-method-handle-changes" class="hash-link" aria-label="Direct link to How Each Method Handle Changes." title="Direct link to How Each Method Handle Changes.">​</a></h3>
<p>Okay, that was looooong. Now let's test out doing changes, I will be looking at <code>Bind()</code>, <code>IOptions&lt;TOption&gt;</code> and <code>IOptionsMonitor&lt;T&gt;</code> methods. The <code>IConfiguration[string-value]</code> will always find the latest loaded values on the configuration so I won't look at it.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="how-the-appsettingsjson-looks">How the appsettings.json looks:<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#how-the-appsettingsjson-looks" class="hash-link" aria-label="Direct link to How the appsettings.json looks:" title="Direct link to How the appsettings.json looks:">​</a></h4>
<p>This is how the appsettings.json looks like, it will be our initial state of the JSON configuration:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token property" style="color:hsl(5, 74%, 59%)">"Logging"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token property" style="color:hsl(5, 74%, 59%)">"LogLevel"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token property" style="color:hsl(5, 74%, 59%)">"Default"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"Information"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token property" style="color:hsl(5, 74%, 59%)">"Microsoft.AspNetCore"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"Warning"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token property" style="color:hsl(5, 74%, 59%)">"SettingA"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"initValue"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token property" style="color:hsl(5, 74%, 59%)">"Secrets"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token property" style="color:hsl(5, 74%, 59%)">"SecretA"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"a-very-secret-value"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token property" style="color:hsl(5, 74%, 59%)">"Key"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">1</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token property" style="color:hsl(5, 74%, 59%)">"AllowedHosts"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"*"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="bind">Bind<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#bind" class="hash-link" aria-label="Direct link to Bind" title="Direct link to Bind">​</a></h4>
<p>To use the bind method we just need to create an instance of the SecretsOptions class then call the bind method of the IConfiguration so the configuration can bind the class. Like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//SecretsOptions.Secrets has the value: "Secrets"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token maybe-class-name">IConfigurationSection</span><span class="token plain"> section </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">GetSection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">SecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Secrets</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> secretsOptions </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">SecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">section</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Bind</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">secretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="testing-bind-method">Testing Bind Method<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#testing-bind-method" class="hash-link" aria-label="Direct link to Testing Bind Method" title="Direct link to Testing Bind Method">​</a></h5>
<ul>
<li>Calling the Update endpoint:
<img decoding="async" loading="lazy" src="https://letspretend.netlify.app/assets/images/bind-update-call-e36f279f61024834cd0908e5e8a30ab7.png" width="762" height="390" class="img_ev3q"></li>
<li>Calling the Get SecretA endpoint:
<img decoding="async" loading="lazy" src="https://letspretend.netlify.app/assets/images/bind-get-value-e02ac6c77447a3960b68bda45b3cf02e.png" width="668" height="359" class="img_ev3q"></li>
</ul>
<p>As seen above the update endpoint's BindAfterChange still has the value <code>a-very-secret-value</code> even though we have changed the configuration, this is expected because the <code>Bind()</code> will add values of the Configuration at a certain time and if the configuration changes, there is no way to update the already bounded instance.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ioptionstoption">IOptions&lt;TOption&gt;<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#ioptionstoption" class="hash-link" aria-label="Direct link to IOptions<TOption>" title="Direct link to IOptions<TOption>">​</a></h3>
<p>The IOptions is one of the ways to get the configuration that is injected in DI via the Configure&lt;TOption&gt; method. To use this method the following has to be done:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//In your StartUp.cs ConfigureServices() or Program.cs</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Add the Configure of the SecretsOptions like so:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Services</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Configure</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">SecretsOptions</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Configuration</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">GetSection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">SecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Secrets</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//In the constructor of my class I'd have something like this:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">private</span><span class="token plain"> readonly </span><span class="token maybe-class-name">IOptions</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">SecretsOptions</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> iSecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">MyClass</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">IOptions</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">SecretsOptions</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> iSecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">this</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">iSecretsOptions</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> iSecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">// Because I am using minimal APIs I don't need to have constructors</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">// As seen in the source code of the app.MapPut() method in the Program.cs.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//In the Update endpoint this is how get SecretsOptions:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> secretsOptions </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> iSecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Value</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>When using the <code>IOptions&lt;TOption&gt;</code> to get the configured section we the <code>Value</code> property as seen above, this will give us the registered Option values that were registered at app start up. A key takeaway here is that IOptions&lt;TOption&gt; offers means to get your configured options via DI without needing to create an instance of the options class and binding it ourselves everytime. This works well for settings that are used in different parts of the application, we can just rely on the DI container to give us the created instance. It's even more useful for settings that don't change but are needed in different parts of the application.</p>
<ul>
<li>Calling the Update endpoint:
<img decoding="async" loading="lazy" src="https://letspretend.netlify.app/assets/images/ioptions-update-call-dd200731dcf20105a9545d42249bf582.png" width="691" height="380" class="img_ev3q"></li>
<li>Calling the Get SecretA endpoint:
<img decoding="async" loading="lazy" src="https://letspretend.netlify.app/assets/images/ioptions-get-value-ae4594064d7939e526e0020c7d870607.png" width="667" height="354" class="img_ev3q"></li>
</ul>
<p>But as seen in the above calls, the IOptions&lt;TOption&gt; doesn't automitically load new change to your configuration. Then comes in the <code>IOptionsMonitor&lt;TOptions&gt;</code> in the following section.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ioptionsmonitortoption">IOptionsMonitor&lt;TOption&gt;<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#ioptionsmonitortoption" class="hash-link" aria-label="Direct link to IOptionsMonitor<TOption>" title="Direct link to IOptionsMonitor<TOption>">​</a></h3>
<p>As far as I can tell with my very little knowledge of the world and the universe of .NET, the IOptionsMonitor&lt;TOption&gt; is the ideal solution to the problem of changing configuration. It offers two ways to access the new changes, with one for just reading, the other for doing way more than reading/writing. The two options are:</p>
<ul>
<li><code>IOptionsMonitor&lt;TOption&gt;.CurrentValue</code> - gets current values in IConfiguration, the latest values.</li>
<li><code>IOptionsMonitor&lt;TOption&gt;.OnChange(Action&lt;out TOption, string?&gt; listner)</code> - adds a listener that can be invoked whenever the configured section changes.</li>
</ul>
<p>In this blog plost I won't be looking at the OnChange option, though it is useful for cases where you'd need to perform some tasks when the configuration changes like. Things like calling an external service that depends on the changed configuration value, etc.</p>
<p>So then to use the IOptionsMonitor in our code, we will do similar steps as IOptions like so:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//In your StartUp.cs ConfigureServices() or Program.cs</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Add the Configure of the SecretsOptions like so:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Services</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Configure</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">SecretsOptions</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Configuration</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">GetSection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">SecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Secrets</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//In the constructor of my class I'd have something like this:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">private</span><span class="token plain"> readonly </span><span class="token maybe-class-name">IOptionsMonitor</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">SecretsOptions</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> iSecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">MyClass</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">IOptionsMonitor</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">SecretsOptions</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> iSecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">this</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">iSecretsOptions</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> iSecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">// Because I am using minimal APIs I don't need to have constructors</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">// As seen in the source code of the app.MapPut() method in the Program.cs.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//In the Update endpoint this is how get SecretsOptions:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> secretsOptions </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> iSecretsOptions</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">CurrentValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>The only difference between IOptions and IOptionsMonitor is how inject them and that the IOptionsMonitor has a property <code>CurrentValue</code> for reading the configured options while IOptions uses <code>Value</code>. This is how the API calls look for this approach:</p>
<ul>
<li>Calling the Update endpoint:
<img decoding="async" loading="lazy" src="https://letspretend.netlify.app/assets/images/ioptionsmonitor-update-480931f8fe44982e117f65c2cc1d8665.png" width="742" height="375" class="img_ev3q"></li>
<li>Calling the Get SecretA endpoint:
<img decoding="async" loading="lazy" src="https://letspretend.netlify.app/assets/images/ioptionsmonitor-get-value-a8a6d3ad4319b27b83025781c4dc5950.png" width="797" height="356" class="img_ev3q"></li>
</ul>
<p>As we can see above the IOptionsMonitor is able to get the latest configuration as soon as it changes and reloads, and just like the Value property of IOptions, the CurrentValue property of IOptionsMonitor is of type TOptions which will be the configured section.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Please note that to get the latest configuration you need to use the <code>CurrentValue</code>. Avoid this:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> x </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> ioptionsMonitor</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">CurrentValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//some code here...</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//using x, thinking it will change:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> y </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">SomeFunction</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">x</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div><p>This will just use the value of x that we got at the time we used CurrentValue, thus no changes will really be used.
Instead try using CurrentValue at all time, like so:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> x </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> ioptionsMonitor</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">CurrentValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//some code here...</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//using x, thinking it will change:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> y </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">SomeFunction</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">ioptionsMonitor</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">CurrentValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div><p>If we use the CurrentValue we will always get the refreshed values.</p></div></div>
<p>Then this leads us to ask:</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-to-use">What to use?<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#what-to-use" class="hash-link" aria-label="Direct link to What to use?" title="Direct link to What to use?">​</a></h3>
<p>Like all software decisions, it depends. Each method has it's own ideal cases but this is how I see it:</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="bind-use-case">Bind() Use Case<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#bind-use-case" class="hash-link" aria-label="Direct link to Bind() Use Case" title="Direct link to Bind() Use Case">​</a></h4>
<p>Use it when you are concerned with getting the configuration once for some set up, like during StartUp. It is also ideal for settings that don't change and are used in one place, so we wouldn't mind creating the instance ourselves.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="ioptionstoption-use-case">IOptions&lt;TOption&gt; Use Case<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#ioptionstoption-use-case" class="hash-link" aria-label="Direct link to IOptions<TOption> Use Case" title="Direct link to IOptions<TOption> Use Case">​</a></h4>
<p>I'd use this for cases where I want to use my settings in different places, this is good because it allows me to get my options from the DI container and I can  reuse it all over my application. I'd use this for settings that hardly change, like service URLs, App Name, logging settings, etc.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="ioptionsmonitortoption-use-case">IOptionsMonitor&lt;TOption&gt; Use Case<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#ioptionsmonitortoption-use-case" class="hash-link" aria-label="Direct link to IOptionsMonitor<TOption> Use Case" title="Direct link to IOptionsMonitor<TOption> Use Case">​</a></h4>
<p>This has benefits of IOptions plus the ability to monitor changes to the IConfiguration. So if I need to apply configuration changes as soon as they happen I can go with this method.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://letspretend.netlify.app/blog/config-set-up-dotnet#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Well this was a looong one but it was fun. So here are some highlights of the blog post:</p>
<ul>
<li>.NET has IConfiguration that reads the configuration from different providers</li>
<li>.NET has means to read the configuration into the application.</li>
<li>To read simple types from the configuration we can use <code>IConfiguration["key"]</code></li>
<li>To read complex types from the configuration we can use <code>IConfiguration.GetSection("Key")</code></li>
<li>Different methods have different benefits when reading the configuration.</li>
</ul>]]></content:encoded>
            <category>.NET</category>
            <category>Configuration</category>
            <category>Dependency Injection</category>
            <category>DI</category>
        </item>
        <item>
            <title><![CDATA[Using Explict Data For Mocks.]]></title>
            <link>https://letspretend.netlify.app/blog/explict-data-for-mocks</link>
            <guid>https://letspretend.netlify.app/blog/explict-data-for-mocks</guid>
            <pubDate>Sun, 04 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Hello there! On this blog post we are going to talk the dangers of using meaningless data inputs when setting mocks and the possible danger this might cause, hang tight and enjoy!]]></description>
            <content:encoded><![CDATA[<p>Hello there! On this blog post we are going to talk the dangers of using meaningless data inputs when setting mocks and the possible danger this might cause, hang tight and enjoy!</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="topics">Topics<a href="https://letspretend.netlify.app/blog/explict-data-for-mocks#topics" class="hash-link" aria-label="Direct link to Topics" title="Direct link to Topics">​</a></h2>
<ul>
<li>What are Mocks?</li>
<li>Setting up a mock in your unit test using Moq.</li>
<li>The Good and the Bad of Moq It.IsAny&lt;T&gt;</li>
<li>Conclusion</li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Just a quick a note on terminology used, considering that I have worked most with the OOP paradigm, most of the terms I will use will be rooted in that background but hopefully this is useful beyond OOP.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-are-mocks">What are Mocks.<a href="https://letspretend.netlify.app/blog/explict-data-for-mocks#what-are-mocks" class="hash-link" aria-label="Direct link to What are Mocks." title="Direct link to What are Mocks.">​</a></h3>
<p>A Mock in the context of unit testing is a module that mimics the behavior of another class/component. These mocks are usually used in Unit tests to replace dependencies that a <code>System Under Test (SUT)</code> needs to perform a task. Mocks are useful for giving the tests the same behaviour as the actual dependency would've given us but they are light-weight and depend on some kind of inputs and set up to give us the behaviour we need, good news, we set up those inputs.</p>
<p>To get a good grasp of what mocks are we going to draw a little diagram and later some code to see how Mocks work using <a href="https://www.nuget.org/packages/Moq" target="_blank" rel="noopener noreferrer">Moq</a> in a C# XUnit Test Project.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="a-little-scenario">A little scenario<a href="https://letspretend.netlify.app/blog/explict-data-for-mocks#a-little-scenario" class="hash-link" aria-label="Direct link to A little scenario" title="Direct link to A little scenario">​</a></h4>
<p>Let's say we have a piece of software that adds recipes to a database using a class called <code>RecipesManager</code>. For the RecipesManager to add recipes it needs to use <code>RecipeStoreService</code> class that is responsible for saving recipes to some database.</p>
<p>In this scenario we can say <strong>RecipesManager has a dependency on RecipeStoreService</strong> that is, the manager needs the store service for it to fullfil it's functional purpose, i.e. to store recipes to some database.</p>
<p>This diagram shows the dependency:
<img decoding="async" loading="lazy" alt="dependency-mangaer-service" src="https://letspretend.netlify.app/assets/images/dependency-manager-service-ee7ca87c33cb85ab13f2b08fcb8df0ad.png" width="559" height="336" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>I know in the diagram above I have used an interface instead of the actual implementation, this is in line with the concept known as <code>Dependency Inversion</code> where a class is decoupled from it's dependency's implementation which may change over time and cause issues. We usually just have the interface which will likey remain with the same contract even though the underlying implementation may change. To learn more about Dependency Inversion please see <a href="https://en.wikipedia.org/wiki/Dependency_inversion_principle" target="_blank" rel="noopener noreferrer">this</a></p></div></div>
<p>The above diagram shows the dependency if the software was normally running but in a unit test we might want to replace <code>RecipeStoreService</code> with a mock for a number of reasons listed but not limited to them:</p>
<ul>
<li>Starting up the original RecipeStoreService can be expensive for unit tests (time/resources).</li>
<li>Mocking dependencies means we have control of the input thus the behaviours we want from the SUT.</li>
<li>The dependency graph of the RecipeStoreService can be big (the service has dependencies that have dependencies etc.)</li>
</ul>
<p>After replacing the RecipeStoreService with a mock we might have something like this:
<img decoding="async" loading="lazy" alt="replace-dependency" src="https://letspretend.netlify.app/assets/images/replace-dependency-with-mock-b28eff88b9962ffb315efc3352638055.png" width="692" height="274" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The above image represents a relationship between our dependency (RecipeStoreService) with a System Under Test (RecipesManager) in a unit test. Most mock framework like Moq wrap our dependencies using an interface to fake our output for a given input.</p></div></div>
<p>The above replacement results in something like this for a given test case:</p>
<ul>
<li>Mock Wrapper when your IRecipeStoreService is called with input A output B.</li>
<li>We will passed the IRecipeStoreService implementation created by our Mock framework to the SUT.</li>
<li>When the SUT excutes code that calls our IRecipeStoreService with A then B will be the output.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="setting-up-a-mock-in-your-unit-test-using-moq">Setting up a mock in your unit test using Moq.<a href="https://letspretend.netlify.app/blog/explict-data-for-mocks#setting-up-a-mock-in-your-unit-test-using-moq" class="hash-link" aria-label="Direct link to Setting up a mock in your unit test using Moq." title="Direct link to Setting up a mock in your unit test using Moq.">​</a></h3>
<p>So now that we have an idea of what a mock is, let's have the above <a href="https://letspretend.netlify.app/blog/explict-data-for-mocks#a-little-scenario">scenario</a> in code and then delve into the reason we have this blog post. Please note I am doing all of this in a simple console application.</p>
<p>Our Recipe Store will look like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//interface for the Recipe Store</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">interface</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">IRecipeStoreService</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  bool </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">AddRecipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">string recipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Implementation</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">RecipeStoreService</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token maybe-class-name">IRecipeStoreService</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> bool </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">AddRecipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">string recipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//stores the recipe and returns true if successful</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(35, 99%, 36%)">true</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>Our Manager like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">RecipesManager</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">private</span><span class="token plain"> readonly </span><span class="token maybe-class-name">IRecipeStoreService</span><span class="token plain"> _recipeStoreService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">RecipesManager</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter maybe-class-name">IRecipeStoreService</span><span class="token parameter"> recipeStoreService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            _recipeStoreService </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> recipeStoreService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> bool </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">AddRecipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">string recipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//does manager responisbilties like validation</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">_recipeStoreService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddRecipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">recipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token maybe-class-name">Console</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">WriteLine</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Stored Recipe with name: {0}"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> recipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(35, 99%, 36%)">true</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">else</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token maybe-class-name">Console</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">WriteLine</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Failed to store Recipe with name: {0}"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> recipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(35, 99%, 36%)">false</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain">  </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>Then we will proceed to have a simple Main method like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Program</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">static</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">Main</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">string</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token parameter"> args</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> recipe </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"Pizza Recipe"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> manager </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">RecipesManager</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">RecipeStoreService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            manager</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddRecipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">recipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain">                </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>This will simply print out this to the console:
<img decoding="async" loading="lazy" alt="manager-result-console" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAe8AAACuCAYAAAAf+oWwAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAAAmdEVYdENyZWF0aW9uIFRpbWUAU3VuIDA0IEZlYiAyMDI0IDE2OjM3OjEwItP/0QAAIABJREFUeJzt3X90lPWh5/H3/MrMZPJrEiYaEliR27QF70UOXeAWThF/gFjobjj+KuVqF3dF13L1FPdCj4vrkXou9Og9dSl7pedCq1KvqMecW9hquV3RHliF1o3pSqppISwQojMkk8n8zvzaPyYkIWaeSQIKj35e53g8zDPP83y/z/fHZ54fmbFMnTo1R0FZltzbyeKjdTx62DbwmoVUGnDF+f7D3fhaa9hx0EHVvG7Wf83BtierOeIO89T6CB0v+NjVbgNfmM0PJPj1D2vZT5zvP3yW+qM17HjTSdDXx+a7Mjz/2CQO2RMDy6rZ8aYTfypHrRc6TtlJuQzWSxeuQXFJvrfhLCV7J/MPbZZhr6dZ/eAZFvonsXmvi/7JoWH7S3PtnBSx405Oh8E7M8jjt+XY/cNJHEjAVTd3sbm2ijXPuUmNY38Ft5mOsemxEB3b69jdBXjD/P36OAd+WMt+o2NtVBaXwbE2KqdRO9gN+kQCIMfcb3eyrrySzS+XEnRlKAmW0GlUP4qVs8A2EyY51kX79eh1uOrmj9hUXsV9L7sG93XtbZ38TbiW9a878i9cHWTnmhT7dtRwMH3uuKRY/eBHLI5XsOs1D+1BCyXlGRg4ZoXrYNS2BseTYn0iw/IHzrDg95P5weAcc45R24JvgZ9t30rQ8ct6fnDINlTnFVY2P13JCWBm0xk2z8/xxo56fnLcYD47pyzC32+McWhLLfsi517MMvfbXXx/qpPdzZUcDljw1vVT2lXKe3Hj+k18/I1ev6tu7mLL5ArW7PIQY+D43XuGJSev5G9/k2LTY0Ecv5nEjlYbvlk9rL/Oyq4t5/p1gWVGY8U71Od3tNmomtHLplX9HHjqCpqDBu1AmqYHu1jqr2HL6w7qbz7LuloP65+uoNOgfuc47DkW3nWapsAVrH+tZFgbaTycGw92isrx5W+dYc+3hl7p+OVk1h9y88yzlaxbGWTzvAz9gVL2POvNFyBRxo7XknxvZRe7ynOQshINeuhNA2k3zzzr5b6VQR7fmKEkZcUfKB9Y5mLbTi9rV/ayaX0aD1b8x6vYvKuMzoTBehdiSoxr3C52tVtGLLDz6qtept3ew1Obsufvz57hmjm9LG1K4XFAtMdJy95qDiYuYH9G2zRqpaDBsTaSMDjWRuU0aoe0QZ8AwELLb6p4/65eHt8YhLCLPTtraQ5cQDkLbbPLJMe6WL8uUIcSRw6wjPhwaMHjGPZZ/Hg5e9oD/M33Orlj8Lg42L3TBytDrLknhNcN0R4Xrz43cMwK1sGgbQ3HQ7E+YcSgbYFo0E5vyk4gOHLsDjn6jofT8yPDXik0nxk1vJUjL9eyY0WQO1Z1scZuIRh0s+8lN+8FJ1i/ov16tPpluGZ6mo73XAPBDWCj5aSD1dOT+H5jBbLUzzvLU8sypHrcvPFCdT6c7RReBoXHSrCMbXtTrFvZxZ67c/SHnRzZW82+4NBbRm8HO83P1VB/V5AtG7NEz3jY8cJQcBdeDxpXnGHLwoEB8OWP2LOwhOefvDI/T2g8DI4Hi/GZ9+ffzKYzbCz3svY597AB8fnZ30SZpZxGVAf5QrGPuGo01mWYp5+ZpZyfBeulLsCl1c/Cxizvt7o+o47wWe9vosxSTiOqg8jYmKWfmaWcn40v/Jm3iIiI2XzBz7xFRETMR+EtIiJiMgpvERERk1F4i4iImIzCW0RExGQU3iIiIiZj4vB2YvE0XOpCmJgTPNOxjPwGPhERuexdhPB2wqUIgNoN1Kx9AuclC5/ZlK7+A74Vt1L4yxkvl7KM0ka2FXjX/pTSmk+/dJeny6n9Pg2f9/qJfLEV/W5zS939VC5Zg+uKWkicov+DrfTu30sWgAbcd/4v3H+8gZ7W0596YSek9lFq7vwOJS4XpEOkz7xFZP8jxHv6LnDDSUgn8/+/5IzKYoI2+lQsoWLtk5RWVmIhQaa7jcShR+j7oG1g+WXSfl+I/ikiF1uR8J5P2S33Y/vTwwRefIesZzYllYGB4M6zjOGnTS4pZwVW3qLn6Yfpt0+n5Bvb8DY9RP/Ox8lc0IbbiL34by+Tr+kzLstl30afBlsFVk8fsedvoK/HiW3aBqpv2Yan5waifrhs2u8L0T9F5GIzntZtDdgr++j/4C0yySQk3yLZM7CsYgM19/1nSgAmH6JuKcCf6funG4j2ALX3U7lsDa6aCnLdbxF57WFi/vzZhHXao1QuWIKj2ofN5SIX+TXBnfeSTALV36Hilvtx1fqwRNuI7V9HuCN/xmiZ8ihVS27FWeMk292HhbZPFHl0SUj2kUu2kHx3P5mvTsdhg0zGeH84F1F6/UN4ps3AVga50FuEdt9Lonobtd/+Vv5K9Mf/A/+zW4dNtIvwrH4CT+0UbPYE6TP782dSA3U33N+oKnDd+jtK/zTizPmaF7niK3v5+PD8wmUxaqMQQANlt/6B8jIn2e53iOxdN9hGhQ3Ur9qHzQWZEetZr3mWmuvnY3dBNtRCbP/DhDtOY/mLbUy6ZQk2e4D+k6exTZ6NpecVel9+hP4i7Q5gmbaNSStm0/+rJkJ/NvoZsvPlMn2QTJL5YBeJBS9SUl1B1PmEQfvNoPTu16i8YthGQrs5u+MRUobLCte9ODP3TxG5FIzveWfeId5RQemyJ3DV+s5f1reV7h9dT+hMguSvr6frR410/WgguG1LqLz1fuynHufsPzUROtVA+a3n7k87sUxZhJP99L7YxMfbFxB4cWt+ArctoeK2DTjObKV7xw10v5PEveIJnE7AeSuVTbdief9hAs/cSe/7xxj3l7LbZuC8dhHW7jZSmSL7Ywalt/2Uspo2+pqb8G+/hbO//Ef6o8Cpdfh/1MhHv3r7k2Ww+SiphUTz9Xz8zN2Eu2dQca7uhvsrJEk22oe10gc04PjKEmyAzVlBNnrauCxGbZR/A4k37sb/zJ2EzkynYtn9xR9fOFe/XzXx8TN30uefTsWyhwbXy3ZspefnC+l6+haCf/LhWfYQDsBS2YD11CN8/PO9WKY6if68iXB6BWXXTB/TcbFUNGBz+bBVVhQr4SicWKbcSkllgHRP0viY0Ubs2X+TP1bb1xOPhEj+/hcDPzVotKxw3cfMlP1TRC6FIhdUT5NobiI3bwPldx6k3L+X8P7HSQzej0sO+/+we2vTvoMrs5+eN/aSATJvbCX+pW24p1WQ/HP+fbloC/3+gTPn6Ln1bsXN0Hq0/pjE/J/imuwk6VyBM7mfnsP789vsaCO7YPqYKmlxfYvqv8v/gG/u45cJNv84v32j/UW/g6e2jfCOR0ieK190+FaN7iUmyUSPke07RmL/45SsHag7BvvrKLS9JJmeAJZqH1SvoPJbS+gPvUO8poKs//Tge4zKMvT/ke/rI93TQrYPku/uJ716xtAZn6Ekmb42sn2QOLSf9HeHrRdtGzjLC9D/3n5S187G7oQMkEsnyYWOkUnPJ5c5RrqnD6unwrgdBo5LtvVeAl0+sv5jxQo3zBQ8q39HKZVY06dIHHqYiH/48TDiw7XsUUr8Wzn77sgrPAWWFah7qsiuzN0/ReRSGMPd0GMkD99L8vfTcS7aRtWdT5DbsY6kwQRvrazAEn1n2KW606SjTlyVFUDhS57WSh/WyqVM+rvbhr2aIOFxYnWO3ObY5RK/pOe/r6P/K8/iWwTZaLLo/rD5sCaOkY6Ovs0xy5wm3ZevuxWD/RlMtplQAOuUBuzTZmMJQcmXZtBfUUHm+EW8nJkIkGNG/v74eA5yOv8MRH69CmzXPEHlgkU4PE5IJLHYi9/aMGyHweMSIOMf++XyvFPEmu8m4u8jGx3futZrnqSi9h1CO39x3jMehZdNrO5g/v4pIp+9sT/KlDlG8q1/JHnNBpy1TpJdA2fQabDYz7+ulg31kfNMxwaDT6XbPUmyIeP7qdlQH9nunZwd7WGdr/SRqxi+zfHLfbCVyLwXKftqA8H3Txvvry5A1jUduwdSBSbIsV22b8DugVy0j2zaYH9Geo6RqZyP56sQ/dVeXNevwWU/TapnaEI1KstobTTq+8ZTptFUfIfKJbNJ/7KJnj8fg+oN1Hx39vnvybQQ3d9HNjF0z8awHQb5sNX6yPrbxlXOXPT0YBh+YlmhlTzfofIb0+nff0v+OYyxLBtL3YuV1az9U0Q+c0X+zns2zlkrsFf4sDgbsH91BQ57gHR06GwoG01i/9IS7J4GrLXzsTmBU6+QsC2h4voV2CpmUPKNDbht7xA/VeRhqI5fkHDeStX1t2KvaMDimYG9duDSeMcrJFhB5ZL8MqunYgJ/v9pG/N02Subdn//UYrS/rleIdc+mfMWjOOtmYPU0YKudj234TeHQabI183HWTc8vG8xHHyVTFuXrPu8hXM53iHf0Ge/PSHcbGc9S3On9JE69QiKzCLfnNOnQWMpSoI0+JRaAjBNLwZ0cI/XB/vMvzY/huFhn/RTfd5vxzhnbrZIxGfWY+XBe/xAl/n8k3NEHNidDB8xo2VjqXoxJ+6eIfOaMz7ydPuxfeojKGxqw2SEbaiP+q0eIDWZwkuShH5NseohJD2yEyP+h75U7ifn3EmpuoGrJo0y6Nv+0ebj54U+exYyU2U/ola1ULHmImv84BSsh0id/TM8rx8gk9xJ6xUflsg1Muq8WSzpEuvsVsuM8Rcj98RckvvEonmlbCXUY7I8Woq+sI7fkISpuuwe7K0E21Ea4+U5i5+6bntpFuOOnVPzNG1Scq3s3gBP7tU/iu6GWXOhtYnsfIZEEMNqf0XFpIxkKwft7yXKaxP9to/wvW0gPX2m0sviThduoe3zHbUz6fkHorflULWvmirL83y1nQvvJpousZ9TuA2/JRU+TSTeQKXL1ZlxGbb/5uL9Ui9X+36hd/9/y70u/Sc/Td5PEYNlE6z6CKfuniHzmLFOnTr3gq6UyjO1WvA/eT//uc39PLHIZUf8U+Vww8Xebi4iIfDHpzFtERMRkdOYtIiJiMgpvERERk1F4i4iImIzCW0RExGQU3iIiIiaj8BYRETGZCwpvR1mGqrF/O7rIRZal/uok9a5LXQ75LJSWZSm9RPvWXDfki9wOl7LuwznKMhcQ3vYYGzf6We4r/lYZwRvmqR9+TJN3xOv2GJt+eJJXt57k1a2n2DTr8vwTfMess7y4daCcPzzLgks1mOwJ1qzpYfHI43iROD6Hk7WjsYed59ruwT7qL3WBxqouxJaNPcy2G9dhTPUrNP4KMdVcl6LpgdPs/HaMqgLvuKB+PawdLswEynmp2+Gi1f3ClE7p4/GH/cbfbV5/3UdsW9b/idc7XpvM+oOfWtk+/1LQj4VUarSFTnZtuYJ9wVEWuZKsvifA3GNX8LevOwZezDC3qYfVs+I0uC0Ez7jZ92oNzacGfrbFG+N7q4IsnJoleqaM3c95OTBy294omx7sxvdO3eB2S6eEWXd7H7NrM6T8bn69t4bd7fnPeqnWSdzZCnjD/P36Mf5UpD3Ohv/aDS/Vs7XNgmNGN7tW5XjmsUkcGuf3f4/V8DoQt9PR6mVrs5veomtmWH7vGRa0TuYHh4d+6cMx6yzP3+hg41OVnAAgxer1HzHtN1PY3Fp8m9feHGTN1+I0uCz4u0rZ81I1B8b7K6cXKNVezX2PePHMCfDM/PGvXzUnwDO3x+n4ZT0/OGQrvsKnwKgOY6qf4fj7PLCQwsInZ+7R+/WlY5ZyXmRjmZMLKYuz7u4++NcrjMO7880rueNgDsojPL4+xpGnatkXtpBKA/ZPHnIZo4SVWNpKMDHWFXJcNaeXNcuiNLqy+I8NX2ajs7Wcn7xZg580s28+y9pvRTm4vYwAaZpWdXNNTw0bX3BQf/NZ1q0K0769nM5zq9v7WX1XL43AYP+xJ1mzqg/PQR/3HbZTO6+bTbf30r6lmiMTDVpXhip7jtpZSRxtLmbOTOLARm358B1fTP3csSpEbdsk1m93Ei3vZ6bXNobgHuAo/paxyzFzhZ+NMxzsfqGOg36on94P8Yu5j7FLpS30p8f/m3yQYe6cBNEeG9OujeE7VM5n/NljkFEditZv3OPPTBw0b6+nufDiy4RZynmxjWFOLijHzGVBrjnjZd0hR/Hf806lLZCyABZSqYHgHlrK0ntOs7w8S8pfyp6Xatg3cMbn8EVZe3sf8+pSEHbxRnMNP2sv9ikqyeoHullal8bjsBA86WHPq172d+W3WdUYYt1NMa7ypfG6c/SHPWx7soZDCSidEuG+lX3M9mXoD5TS/Gr1YFlKp0RYtzLE7MkZSlI2/F1lbNteydEi2/TNOcvmFXFq3TmiPUN1KJ3Rw5bbo9TabXQcd+CZmsATKGfbzireG8uEkLbjD9jpHXMQ5qj1QctLV3JgfhdNI5Z2Hs/f9HW48vWN9tiIAvhiLKxz8uqzpZyIwIm95SzdGGGxr5zdgfx2G2/sYa6/mueD3Sw/t0FXivpyB4daS+hNQ2+rm9PLYlS5gMhYyzxCeQZPl5sTk+M02i3Mm+zg6Mk0tWVA0Lj9cCVZ3hRiyfQkteWQ6ill1/YaDow41vVzzvL4Mti9fRIHwmkaym28/3sXnQkg4eTQsKQp2D99fTz1cC/TAKZ28upKgBJeffJK9hhW0KDvumKsnJPj4HM17Duer1Nv69DQK1z3JKsf6GGxL43XDVG/+7wxVtUY4vtNYRqrsxC34W+tYX2zi5ThNo0ZjtuyOAunlrDvOTcL74oxz1s+cIXIaNwaj2kjVVeHWHdbmNnVOYI9NjyUFF1nTMY9/sBoris0T4BxGxkp1A6OuhBb1sZ5f+cV/OyUJf/ve5Ic2F7Lr309PHNPBC/AmSrWPV0xFAgG/Xp3wLjdx98OORavOc2So/X84PDQndnSOQF2zfKw5mCCbRMpZ9C4HQwVmkMixmPFqO4Tyriic7JRHeIsn2nhjZ0eein2k6BF2WnZ6+P5k9B441nWrQzT8nQFnfYEa9cEmdZWw8ZnS/DM6mHDqiDtWyZxyCjc7Bmm1cHh5+rZHcgw+8Ye1t4TpHfgjK/q6hgzKWXLDg8nwhYcbogmAFeC++7upb61hk3POahd2M26u4P4n6zmCPllta01rN9ZAlNDbFqVyj/0YLRNoPfDSrYcr8Yfz9G4LMDG2/s48kMvfm8K7/Ea7nstzaYH4xx4uo5U00fcMaec98Z0KdHJju3j+c1nK0dez9+gW1DgUuDcb59m47VZCHt4arubGODwpagNl9DpjrBpbZyWFyroDKep9wEBwBdm7awSdj/t4rxPBBEnRwNBlq+I8n6zG8/iCLXHy2mZaHBDPrzjLprDERbOs9AYLOWAvZdGN8btl0jTdI+flZTzzLPVtAfB483RG2FY781RP6eHTctyNO+cNHAJysnB9ixrbg9y4qVKDnQNe7zDqH8GKli/wcPyB86w4L3J510adkw2qJ9B322ZmqQx7eap46NMMkZ1T2eYVpej5YU69nTluObms6xdGeb9pys4QZI7msJw8AruO2ynvzxNg92WDwXD42lUB+NxW/rlONMCbna0u/EEQ8xtzLLvsNV43GI8pgtyxVh7V5jSdyax7rAN36xe1t9o8P5xGe/4g4JzHYXniaNGbWS4K4N26Kpk25sJNt/ey5EdHmbfHiH6rwO32YLV3LOhmqp5o9wyMOjXhvtjIu1gIRi24vFmgBwzZ6Xwt7ooKc8SDduItU+0nMbtUJjBHGKYHQZ1n2DGFZ2TDTimJmiMu9h3Kv/vC/xTMQt+v4NA0MGhg6X4ff002sHRGGUeHnbtddMZsdF+qJIj8QTzrh7bNnvDNnqDJRxo9nKQGIsbhx7cSoVLONplpzdiIxCw5UPq6gizU/n9nQjaObK3isOpGIuvzuWX4eH51/Jl6QzaPnGPZbRtAqQiDk4ErcQSNt47WEqnKz30ZHPKQjRox5+2EI3b6QhY8ZRnL+xwXoAj/9zAHZuv5JmTSe67q4+rANxZHGkLKXuWqvIMVXYr0XSOEncOyLBkRYTe31RyJDEyVBy8+loZzAyyeeNpNi/M0XLQfUGXSB3uLCVYaWm1M/umKL1HXQTTOTzunGH7URdhaZ2TPc9WceiUnUDEzolTjmGXv3NMW3iWx2/M8eqOSewbPKOzceC5K9nWmmX52k523htksS/fj8bcP8d9i6BA33VnccSto16yN6z7uW0G7QSCDg68WYrfl2SaHcBKNJGjdnqC+nKIBR20B6xj3GaBNjI8Ljlmz0wS/NBNJw6OHLfRODMx7Mlbo3FrPKZHLcuXY8yOe9j9uovOoIP3Piz5dO6ujNnocx0YzROF28hIsf554s0a9oSjfP+hAEvTFew4fP45WH+xfjtiudH+JtoOgYAdT3kGhy/C2lU9rJySo8qboTcwFMbjLWde4XYoyGAOMcwOg7pPOOMM52RjHm8aT9Ax+EHl4j03l7ASJYfDDlXeNJ7qJJu3hs97S4s7B4zjXlvaTmcwx1xvFih8RlvlzeCIOBn6eWI7nZH8elVkcASddI57Is5x1Zwga2+MM608SyphweG4SJftPiWpSAn7X61g4cYIC30V7IlbSdlzOLoqWf9YBdDPWruF/rgFx5Qwy72l/OTdUY6rK859TQne3zWZnxyHxgU9bFjVzeInfRyY4Nm3w5WFtIXoh+X8+mgJHUetlMwEhytHVVnh9nOQwZNw0FFwvxkaZ6bhTDXtwZF9y8aRN2s4crCSuSu6Wbc2SHRLNR0Xq38aGd53gxZS7iyeUd5m1Hc/YdgYI+1g93M+uDnE99f3kjpZzp7mSg4ELEW2aTSODI6LPcm8q60cPZC/Gdlx1EV0VZxr7KUcMaq74TKDspRl4Lw6XEbOawejeaJwGxkpPn/aOfiuk9W3x+k86B7DvVJjRvurck2sHfxBGyWNGabNTFDSA40z+2n35vB/eBEfQDuvHQq/zeEtPIcUy45CdZ9wxhnMyeN1kR96z3966I3YiPor2TT4VO5E5e+JxiLGn1Z7IzZSZWlqOXflIU1tmYXeiJWo3QZlGbwUvSpxPm+EtU1JOl+4gkfb7ODrY8uDI66HpJ3sa7bSm6Dgnzt85oZ14lTAgb88QX0ZHI0AZf3Ul9tpD0D9nDgNtSm2bO0btnIXzziuZN2HcWbiZuvx/HFvP1TBkYUBZk+GA+0TK5bHnoMUkHDS/HL+kuXclAWHPWfYfqmwjagrNVSHT7DzxnNeWHaWTWtg864yTowcyGk7R/ZW8P6sILProGWs/XPk6IhbR4Rwliq3heioD54N9d3USSenXX0snFLF0RH354zqXlTQxe5/drHblWLBsm7uW5sjuMXL0Qlu03DcXh1npjuN93snWTr4oo25U+HIycJ1/6TRlmWpr8sS7LIPXvXqjdhIeYfX4XIzcKZUbJ4o0EbvGYRN0fmzLMa6ZSlaDpRRf103TUevoHk8B2lEvzban2PWxNoh5XcQLE+wfKaFX79cxtwVEebabXQW+eBiVM7RFT9jNZpDjMZfL4XrPtGMM5qTi4kGh8rTy6f0DWupD8tocYdZ1xSj0ZuhqixN45T0GB8gzNL45ST13jTXXhdiodvNwQ+NGzz1oYcWR5TVK+Jc5U1z7c29LHSUcuBDC7EP3bS7I6y+LkG9N83Mq/tHPQMazeDnZ3uuwN9G2jja6prAWf3EOOw5SuyAY3h5Usydk+Aqb4Yqbz9LmsI0Bl0cCQCBUg4GkqxcEeMqb4oFK8I0Bko5EIATr9excsPUwf+2vGfl9IE67ttbQirgoLc8zpIZaRzk8M2IMrPcTscFzKKe8twnngDuT0NJedaw/Tjl4WAgwR2rQiyYksZXlqG+rv+8L2ZJxV38bEctB929bLwtPvBBKsWCeXEavVlKXRkaZ8WYZrfTGRlL/7Ti77HQMDO/3Dewv9QZJ+32GCsX9OMry9C4oI/ZdictZ86tV6DvRkppPppj8apuljem8HnTNM6Ica3XuO8aS3PtnIH6pW2cOO6g35XBax/bNlNhG1Fvgrl1w+pncFyuakzg+bCG1YN9pp5dx7I0Np67g2s0bo3HtG/BWZ566AybFmSGyvehhxYirBkoi688+4nHpEarw1iWXWyF54nCbWTEuH9mWHJ7EN/RGra97mVHa5aVt4fP+3v2WNBO1Jdg7pSRdS/Qrw32N5Z2GFXAQaA8ylxKOXi8lCPpGPPKHbQPu+Y+3nJOmMEcYjRWjOo+4YwzmJOLSZ100VGeYG5d/t+2ysrKx4quVdLPjQtTnDroof3cDWNrikXXJen9XTl/iADufm78epoTv/VwLGHn93+yMX1uiFVLQty2MMpfVdt5t6WEsNF+rCkWXRdjqi/O8pv6mFfj4I2Xa2j+eODJv7+IcL3Hxb+0OjjvglzaQWuHhVlfD3HnjX18ze3klRerOdBjgf4S3vdnmXd9L6tuCvM1XxaP08GRN0s5lTXYZqKEE8kky24JsmpZiH83px9b0MWht930NkRZWunkX94fWqf2q2G+lvbw2p8v4LKQNcWi6/r56O0y2kec5DeuOMOO/9DLvElQMTXCbTfE6W8t4wNrP8uXB/nukhC3fT3G1EQpz+6p4t2YBbDyQbuDq74eZM2yMNdk3fzshSr+EPvkruv/so+/SpTly58ooT2aYunyHv7TN0MsnW7h6GvV7P6z7fxj5O7nxq9naB84lkZqvxpmob2U5rahmevKmRG+nitlX5urcPth4w9HnVR8KcrKG3q57YYwixrT9LV7+CA2rA/22Xiv3cbsb/awMO7hQCjNosUhVn8zyHduCPPXdTZaflnNnhNWsuli/dOC/2NrfvnSPm6Zmab3jx4+6Cnhj/4s37iph+/e3Mdf++y83VzDK53WIn3XQucHbronxVl5Uy93LowwpwECf3LzQY9B3zUaY6S48ZtB1izr5c6b+lhUb+UP+7288v9sZI3Gw4Bst53s1RFWLQ8N1a+30HGxMWtpiPKjXl4/de7zvpWoL87K6TbeetfC1wrVvciYBqA8yaJ6nLpaAAAEo0lEQVSZWU79rpy3z52ZpR20dtj48vxeVi8L8e//Mk004Oa3b7sGz4JGrUOk+LJxM2qHSOF5otNq0EZG+zPon5lZQf7LrBJ+8vMyzmQtBE7YmXZDkHnRMn577nmPoINEQ4Q7l/ey/Ly6F+jXBdu9hPAY2mFUWQtTZ0Xhf1fzP7tsfGRNsqzKxQuHnYNXV8ZdzphBOxieQBnMIb0GY8Wo7kXnkIKdacxz8mj9or+hj5XT7fy21YFl6tSpl8/XeNljbHosRMf2OnZ3XayN5vD5MqTCVvrtWRoXd7N+ainf337p/ka1IHuMTY+FaXmqwJe0XG4GvqRl36f4RSum8an0XZMwqvsX+biIXGzeCI8/GCK1t8iXtHwu2JOsXNXN4skZSlJW/F0edr1UdvkF96Aka9afZDVWWl6uZ2vrRXqA6iJyzDrLrttiOIASStl3qQskIvJFECzjH17qZ8uqwGV25i0iIiKGSutS+klQERERM4l1ORTeIiIiZqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZBTeIiIiJqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZBTeIiIiJqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZBTeIiIiJqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZBTeIiIiJqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZBTeIiIiJqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZBTeIiIiJqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZBTeIiIiJqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZBTeIiIiJqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZBTeIiIiJqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZBTeIiIiJqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZBTeIiIiJqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZBTeIiIiJqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZBTeIiIiJqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZBTeIiIiJqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZBTeIiIiJqPwFhERMRmFt4iIiMkovEVERExG4S0iImIyCm8RERGTUXiLiIiYjMJbRETEZP4/7qnWL67dXesAAAAASUVORK5CYII=" width="495" height="174" class="img_ev3q"></p>
<p>This is sweet now, let's test this using Mocks. Just a reminder, we are testing RecipesManager not Program.cs' Main so we won't be looking at that logic. To Start we will need to create an xunit test project like <a href="https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-with-dotnet-test" target="_blank" rel="noopener noreferrer">this</a>. I have alreay set up my tests and have a test project called <code>MockSetUpTests</code>.</p>
<p>In There I will have a simple test cases:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">RecipeManagerTests</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token maybe-class-name">Fact</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">AddRecipe_WhenCalled_ReturnsTrue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// Arrange</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> recipe </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"Pizza Recipe"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> mockRecipeStoreService </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Mock</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">IRecipeStoreService</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        mockRecipeStoreService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Setup</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">x</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddRecipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">recipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Returns</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token boolean" style="color:hsl(35, 99%, 36%)">true</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> manager </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">RecipesManager</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">mockRecipeStoreService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token known-class-name class-name" style="color:hsl(35, 99%, 36%)">Object</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// Act</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> result </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> manager</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddRecipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">recipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// Assert</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token maybe-class-name">Assert</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">True</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">result</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>This will result in a passing test:
<img decoding="async" loading="lazy" alt="test-pass" src="https://letspretend.netlify.app/assets/images/test-pass-f63f875ae32fc6caab93ca0154801f10.png" width="997" height="88" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="how-we-used-moq-to-mock">How we used Moq to Mock<a href="https://letspretend.netlify.app/blog/explict-data-for-mocks#how-we-used-moq-to-mock" class="hash-link" aria-label="Direct link to How we used Moq to Mock" title="Direct link to How we used Moq to Mock">​</a></h4>
<p>This is how we mocked the <code>RecipeStoreService</code>:</p>
<ul>
<li>Created a mock that wraps our service like this: <code>var mockRecipeStoreService = new Mock&lt;IRecipeStoreService&gt;();</code></li>
<li>Then we proceeded to SetUp our mock for a certain call with this line: <code>mockRecipeStoreService.Setup(x =&gt; x.AddRecipe(recipe)).Returns(true);</code></li>
<li>By setting up we are telling mock if the IRecipeStoreService you created is given input "Pizza recipe" return true, otherwise it would return false and the test fails.</li>
<li>Then our manager can do whatever with response, in this case it just propagates the value to the caller.</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="itisany">It.IsAny<a href="https://letspretend.netlify.app/blog/explict-data-for-mocks#itisany" class="hash-link" aria-label="Direct link to It.IsAny" title="Direct link to It.IsAny">​</a></h4>
<p>Now let's talk a little about some magic wand, In the case above we see that recipe we pass to the manager will further be used in the store service. This might lead those who use Moq a lot to use this magic wand: <code>It.IsAny&lt;string&gt;()</code> which would lead our set up line to look like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">mockRecipeStoreService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Setup</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">x</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddRecipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">It</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">IsAny</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">string</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Returns</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token boolean" style="color:hsl(35, 99%, 36%)">true</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>This tells our test <strong>It doesn't matter what string value I give you just return TRUE</strong>. Let's use talk about the danger of this.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-good-and-the-bad-of-moq-itisanyt">The Good and the Bad of Moq It.IsAny&lt;T&gt;<a href="https://letspretend.netlify.app/blog/explict-data-for-mocks#the-good-and-the-bad-of-moq-itisanyt" class="hash-link" aria-label="Direct link to The Good and the Bad of Moq It.IsAny<T>" title="Direct link to The Good and the Bad of Moq It.IsAny<T>">​</a></h3>
<p>The Good of It.IsAny is that when we really don't care what value is passed to our dependency we don't need to have a test value for it, the bad? If we care and still use It.IsAny.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="the-danger">The danger<a href="https://letspretend.netlify.app/blog/explict-data-for-mocks#the-danger" class="hash-link" aria-label="Direct link to The danger" title="Direct link to The danger">​</a></h4>
<p>We are going to change our code to show the danger of this, consider our manager changes and we want use  a request Object like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">RecipesManager</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">private</span><span class="token plain"> readonly </span><span class="token maybe-class-name">IRecipeStoreService</span><span class="token plain"> _recipeStoreService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">RecipesManager</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter maybe-class-name">IRecipeStoreService</span><span class="token parameter"> recipeStoreService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        _recipeStoreService </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> recipeStoreService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> bool </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">AddRecipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter maybe-class-name">RecipeRequest</span><span class="token parameter"> request</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//does manager responisbilties like validation</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">_recipeStoreService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddRecipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">request</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Founder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token maybe-class-name">Console</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">WriteLine</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Stored Recipe with name: {0}"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> request</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Recipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(35, 99%, 36%)">true</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">else</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token maybe-class-name">Console</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">WriteLine</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Failed to store Recipe with name: {0}"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> request</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Recipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(35, 99%, 36%)">false</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain">  </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Request object</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">RecipeRequest</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">string recipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> string founder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">Recipe</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> recipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">Founder</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> founder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>We now introduced a new Request object but we accidentally stored the Founder name instead of the recipe but because we used the <code>It.IsAny&lt;string&gt;()</code> in our code base the test will pass. In our test we just need to add the Request model and pass it in our act statement, the rest should work fine:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"> </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// Arrange</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> recipe </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"Pizza Recipe"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> request </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">RecipeRequest</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">recipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"John Doe"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> mockRecipeStoreService </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Mock</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">IRecipeStoreService</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">mockRecipeStoreService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Setup</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">x</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddRecipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">It</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">IsAny</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">string</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Returns</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token boolean" style="color:hsl(35, 99%, 36%)">true</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> manager </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">RecipesManager</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">mockRecipeStoreService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token known-class-name class-name" style="color:hsl(35, 99%, 36%)">Object</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">// Act</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> result </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> manager</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddRecipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">request</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">// Assert</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token maybe-class-name">Assert</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">True</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">result</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>This would be misleading because now we will think our code works as expected until we run and see otherwise and sometimes such bugs are easy to not see then we have this kind of code in production, so what is the solution? Here's How:</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-correctly-verify-inputs-on-set">How To Correctly verify inputs on set.<a href="https://letspretend.netlify.app/blog/explict-data-for-mocks#how-to-correctly-verify-inputs-on-set" class="hash-link" aria-label="Direct link to How To Correctly verify inputs on set." title="Direct link to How To Correctly verify inputs on set.">​</a></h3>
<p>Moq and most mocking frameworks provide a means to make your test inputs more explict to what they need to perform a task. Moq has <code>It.Is&lt;T&gt;()</code> which is helpful to make sure the paramter passed is the value we want, In test we would swap <code>It.IsAny</code> for <code>It.Is</code> like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">mockRecipeStoreService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Setup</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">x</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddRecipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">It</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Is</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">string</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">c</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> c </span><span class="token operator" style="color:hsl(221, 87%, 60%)">==</span><span class="token plain"> request</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Recipe</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Returns</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token boolean" style="color:hsl(35, 99%, 36%)">true</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>Now this tells mock make sure the string passed to AddRecipe is the same as the Request's Recipe parameter if I run my test with this change, I get:
<img decoding="async" loading="lazy" alt="failed-test" src="https://letspretend.netlify.app/assets/images/failed-test-9d3ef9f9dd019868ec5b1b7a9765021e.png" width="980" height="87" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Always make sure your mocked dependency have meaningful data so you can avoid such situations.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://letspretend.netlify.app/blog/explict-data-for-mocks#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h3>
<p>That will be it for the blog, pretty lengthy! Here's somethings to remember:</p>
<ul>
<li>Mocks are meant to replace dependency for the SUT.</li>
<li>Always make your set up input data reflect the actual data</li>
<li>Be explict with your inputs, especially if they are used in important places.</li>
</ul>]]></content:encoded>
            <category>Testing</category>
            <category>Moq</category>
            <category>Unit Tests</category>
            <category>.NET</category>
            <category>Xunit</category>
        </item>
        <item>
            <title><![CDATA[Dangers Of Nullables]]></title>
            <link>https://letspretend.netlify.app/blog/dangers-of-nullables</link>
            <guid>https://letspretend.netlify.app/blog/dangers-of-nullables</guid>
            <pubDate>Thu, 18 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Hello There, In this blog we are going to talk about the dangers of casting nullable booleans in C#. This was an actual bug in some codebase I worked on and it took a while to find (also not a unit tested scenario but was tested manually).]]></description>
            <content:encoded><![CDATA[<p>Hello There, In this blog we are going to talk about the dangers of casting nullable booleans in C#. This was an actual bug in some codebase I worked on and it took a while to find (also not a unit tested scenario but was tested manually).</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="topics">Topics<a href="https://letspretend.netlify.app/blog/dangers-of-nullables#topics" class="hash-link" aria-label="Direct link to Topics" title="Direct link to Topics">​</a></h2>
<ul>
<li>What is a Nullable boolean</li>
<li>Casting Warning.</li>
<li>How To Get Around the Cast Possible error.</li>
<li>Conclusion.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-a-nullable-boolean">What is a Nullable boolean<a href="https://letspretend.netlify.app/blog/dangers-of-nullables#what-is-a-nullable-boolean" class="hash-link" aria-label="Direct link to What is a Nullable boolean" title="Direct link to What is a Nullable boolean">​</a></h3>
<p>In the world of coding we say a data type or structure is nullable if it can contain a null value (to an extent). This means that I can use null in place of this datatype and my program won't complain, in C# you would see something like the below:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">MyClass</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Can be written as public Nullable&lt;int&gt; NullableInteger { get; set; }</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> int</span><span class="token operator" style="color:hsl(221, 87%, 60%)">?</span><span class="token plain"> </span><span class="token maybe-class-name">NullableInteger</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain">   </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//can assign null here</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> int </span><span class="token maybe-class-name">NotNullableInteger</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//can't be assign null to this.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>In C# we usually use the question mark symbol <code>?</code> to make a property nullable. This is useful for some reasons:</p>
<ul>
<li>Your code is explict with letting you know this value can possibly be null</li>
<li>Every nullable property/type in C# is wrapped inside the <code>Nullable&lt;T&gt;</code> class</li>
<li>Nullable types have properties like <code>HasValue</code> and <code>Value</code> thanks to the Nullable wrapper.</li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p><code>Nullable&lt;int&gt;</code> and <code>int?</code> are the same thing. The Nullable wrapper offers ways in which the consumer of data your structure can check if they have a valid value.<br>
<code>HasValue</code> is boolean that is set based on the <code>Value</code> property, it indicates were the value of your structure has actual data or null.
Instead of something like <code>if (myNullableObj != null)</code> you can go: <code>if (myNullableObj.HasValue)</code>. Then the Value property has your value or null.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="casting-warning">Casting Warning.<a href="https://letspretend.netlify.app/blog/dangers-of-nullables#casting-warning" class="hash-link" aria-label="Direct link to Casting Warning." title="Direct link to Casting Warning.">​</a></h3>
<p>In our codebase we had a nullable property that we used to check a condition and C# gave us a warning against this.<br>
<!-- -->To illustrate what we had, lets look at the below:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">namespace nullable</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Program</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">static</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">Main</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">string</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token parameter"> args</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> starWarsMovie </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Movie</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Star Wars The Clone Wars"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">starWarsMovie</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">IsGoodMovie</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token maybe-class-name">Console</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">WriteLine</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"A Good Movie Indeed"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Movie</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">Movie</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">string movieName</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token maybe-class-name">MovieName</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> movieName</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">MovieName</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> bool</span><span class="token operator" style="color:hsl(221, 87%, 60%)">?</span><span class="token plain"> </span><span class="token maybe-class-name">IsGoodMovie</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain">  </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword null nil" style="color:hsl(301, 63%, 40%)">null</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>You can notice I set my <code>IsGoodMovie</code> property to have a default value of null, just for the sake of this blog post.
If you have ever used C# before you might know that the above if statement in the Main method will cause the compiler to freak out and your IDE/Editor will scream at you with this error code: <a href="https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/cs0266?f1url=%3FappId%3Droslyn%26k%3Dk(CS0266)" target="_blank" rel="noopener noreferrer">CS0266</a></p>
<p>This will tell you something like <code>Cannot implicitly convert type 'bool?' to 'bool'. An explicit conversion exists (are you missing a cast?)</code>. Tempting suggestion, and spoiler alert, we fell for it!<br>
<!-- -->So essentially the error says, the if-statement expects something like <code>if(bool)</code> but you are trying to do <code>if(bool?)</code>, because remember our <code>IsGoodMovie</code> is nullable it is not a <code>bool type</code> but a <code>bool? type</code> or you can say <code>Nullable&lt;bool&gt;</code>.</p>
<p>So what do you do then? well we went the casting route and had something like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//cast by adding (bool).</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">bool</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain">starWarsMovie</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">IsGoodMovie</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token maybe-class-name">Console</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">WriteLine</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"A Good Movie Indeed"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>Casting just means forcing an object which type A to be type B. The Language takes care of value conversion, some types are easy to cast some are hard and can cause unexpected results, so not recommended if we don't know what we are getting ourselves into!</p>
<p>This didn't totally solve our problems we now have a warning with code: <a href="https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/nullable-warnings?f1url=%3FappId%3Droslyn%26k%3Dk(CS8629)#possible-null-assigned-to-a-nonnullable-reference" target="_blank" rel="noopener noreferrer">CS8629</a> but we were not phased and didn't pay attention to the implication of this warning.</p>
<p>The warning was telling us: "Hey, nullables can possibly have null values and you are assuming it is not null here". C# even gives you this beautiful message:
<img decoding="async" loading="lazy" alt="nullable-bool" src="https://letspretend.netlify.app/assets/images/nullable-bool-warn-b5362fd0ae476fa4030a230c7547f21f.PNG" width="639" height="221" class="img_ev3q"></p>
<p>If I run this piece of code, knowing  that my IsGoodMovie is null I will get this runtime exception:
<img decoding="async" loading="lazy" alt="nullable-bool-excepton" src="https://letspretend.netlify.app/assets/images/nullable-bool-exception-e7f8894642b095efa6fc162290f4289c.PNG" width="1441" height="400" class="img_ev3q"></p>
<p>And Oops! Just like that we broke production, yup, BIG NO NO! So this is the danger: <strong>Don't rely on nullables always having a value</strong>.
So we assumed <code>(bool)null =&gt; false</code> but we got humbled! because this is not the case, the C# Runtime can't change nothing (null) into a valid true/false.</p>
<div class="theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>danger</div><div class="admonitionContent_BuS1"><p>Never assume a nullable has a value, the whole purpose of it being nullable is to give the consumer an indication that it may be null.
It is your responsibilty as the consumer to handle for such situations if they do arise.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-get-around-the-cast-possible-error">How To Get Around the Cast Possible error.<a href="https://letspretend.netlify.app/blog/dangers-of-nullables#how-to-get-around-the-cast-possible-error" class="hash-link" aria-label="Direct link to How To Get Around the Cast Possible error." title="Direct link to How To Get Around the Cast Possible error.">​</a></h3>
<p>Our fix around this was simple; use the capabilities Nullable provided for us so we change our code to:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">static</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">Main</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">string</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token parameter"> args</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> starWarsMovie </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Movie</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Star Wars The Clone Wars"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">starWarsMovie</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">IsGoodMovie</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">HasValue</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&amp;&amp;</span><span class="token plain"> starWarsMovie</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">IsGoodMovie</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Value</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token maybe-class-name">Console</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">WriteLine</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"A Good Movie Indeed"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>Now we use <code>HasValue</code> to check if the value in IsGoodMovie is a valid boolean if true, we then proceed to check if value is true, only then do we go into our if.<br>
<!-- -->Simple fix but it has made us aware of something important <strong>DON'T JUST CAST TO GET RID OF ERRORS</strong>.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Notice I started my if-condition by checking HasValue because this is an AND operation if the first check fails, then the if-condition fails and we won't accidentally use null.</p></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>When using an AND if check always start with a less costly operation because if it fails we exit and we will have used little resources and don't need to do the big operation.<br>
<!-- -->i.e. if (myObject.Property &amp;&amp; SomeServiceThatCalculatesStuff()) so if my Property is false we quickly exit and we don't do uneeded calculations that would have led to the same result. This is reffered to as fail fast.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion.<a href="https://letspretend.netlify.app/blog/dangers-of-nullables#conclusion" class="hash-link" aria-label="Direct link to Conclusion." title="Direct link to Conclusion.">​</a></h3>
<p>Okay, I enjoyed this blog, was nice. Here are the main points:</p>
<ul>
<li>Don't assume Nullables have values</li>
<li>Always use the machinism provided to help with checking nulls.</li>
<li>Don't just cast because it removes errors.</li>
<li>Always test your assumptions - tests are good negative indicators.</li>
</ul>
<p>Until next, keep pretending until you are not.</p>]]></content:encoded>
            <category>CSharp</category>
            <category>.NET</category>
            <category>CodeDesign</category>
            <category>Exceptions</category>
            <category>Debug</category>
        </item>
        <item>
            <title><![CDATA[JQuery AJAX Data Type]]></title>
            <link>https://letspretend.netlify.app/blog/jquery-data-type</link>
            <guid>https://letspretend.netlify.app/blog/jquery-data-type</guid>
            <pubDate>Fri, 12 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Hello There! In this blog post we will be looking at how JQuery's AJAX call can think your successful AJAX calls are not successful only because of the dataType you used when calling a remote API.]]></description>
            <content:encoded><![CDATA[<p>Hello There! In this blog post we will be looking at how JQuery's AJAX call can think your successful AJAX calls are not successful only because of the dataType you used when calling a remote API.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="topics">Topics<a href="https://letspretend.netlify.app/blog/jquery-data-type#topics" class="hash-link" aria-label="Direct link to Topics" title="Direct link to Topics">​</a></h2>
<ul>
<li>What is JQuery and AJAX.</li>
<li>Doing an AJAX call with JQuery.</li>
<li>JQuery "mistaking" your success as error</li>
<li>The "fix"</li>
<li>Conclusion</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-jquery-and-ajax">What is JQuery and AJAX.<a href="https://letspretend.netlify.app/blog/jquery-data-type#what-is-jquery-and-ajax" class="hash-link" aria-label="Direct link to What is JQuery and AJAX." title="Direct link to What is JQuery and AJAX.">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-jquery">What is JQuery?<a href="https://letspretend.netlify.app/blog/jquery-data-type#what-is-jquery" class="hash-link" aria-label="Direct link to What is JQuery?" title="Direct link to What is JQuery?">​</a></h4>
<p>Well in the world of web development <a href="https://jquery.com/" target="_blank" rel="noopener noreferrer">JQuery</a> is pretty famous it is a library that allowed web developers to make their websites more dynamic and do edgy stuff without doing a lot of vanilla javascript, yes, there is still a lot of heavy lifting were you need to do a lot of work for yourself when manipulating the DOM as oppossed to using a library like React or a Framework like Angular.</p>
<p>JQuery was (and still is) amazing because it allows you to use selectors to manipulate DOM elements like divs, p1, h1, etc. It also has capabilities to insert html into the DOM with the <code>.html(data)</code> function where data is any html you want to insert.</p>
<p>Apart from that JQuery allowed developers to change styling on the fly as they need to with the help of the <code>.css()</code> function. Below is an example of how we can use JQuery to simply just change the text of a div and insert some h1 tag:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token doctype punctuation" style="color:hsl(119, 34%, 47%)">&lt;!</span><span class="token doctype doctype-tag" style="color:hsl(230, 8%, 24%)">DOCTYPE</span><span class="token doctype" style="color:hsl(230, 8%, 24%)"> </span><span class="token doctype name" style="color:hsl(230, 8%, 24%)">html</span><span class="token doctype punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">html</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">head</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">src</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(119, 34%, 47%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag attr-value" style="color:hsl(119, 34%, 47%)">https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">$</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript dom variable" style="color:hsl(221, 87%, 60%)">document</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">ready</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">function</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">        </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">$</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"#myDiv p"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">text</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"This is the new text for the paragraph."</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">        </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">$</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"#myDiv"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">append</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"&lt;h1&gt;This is a new H1 heading&lt;/h1&gt;"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">head</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">body</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">div</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(119, 34%, 47%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag attr-value" style="color:hsl(119, 34%, 47%)">myDiv</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">p</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain">This is a paragraph.</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">p</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">div</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">body</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">html</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><br></span></code></pre></div></div>
<p>JQuery uses selectors to find elements in the DOM. To find any element with an id we use the hash symbol (#). In my example because my div has an id attribute set to <code>myDiv</code> thus to select that element using JQuery I just go <code>$("#myDiv")</code> you can even store this in a variable and console.log() it to see how a DOM element looks as javascript object.</p>
<p>In the above example the first line in my script finds my div by id then looks for any p child inside the div then changes the text using the <code>.text()</code> method.</p>
<p>A line later I use the <code>append()</code> method to append a child to my div this will add a new h1 tag to my div. This is just a simple example to try and show you how JQuery works, you can copy the HTML then serve in any web server you like locally and you will see the result 🙃</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>You may have noticed the use of <code>$(document).ready(function(){...})</code> in the example, this is best practice as it lets JQuery wait for the DOM to be ready before starting to manipulate it, it is best practice to have your JQuery inside of the function if you want your JQuery to execute as soon as the DOM is fully loaded otherwise in the case of creating, say, onclick event functions that will be used when you click a button then it's okay because your function will run when the DOM is loaded i.e. when you are able to click buttons etc.</p></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Make sure you always import your jquery first from your cdn then followed by the script that uses JQuery as seen in my head tag of my html document. This is because the JQuery function <code>$</code> wouldn't have been loaded if you start with a script that has a JQuery dependency.</p></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-ajax">What is AJAX?<a href="https://letspretend.netlify.app/blog/jquery-data-type#what-is-ajax" class="hash-link" aria-label="Direct link to What is AJAX?" title="Direct link to What is AJAX?">​</a></h4>
<p>AJAX stands Asynchronous Javascript And XML. It is used for sending HTTP request to the server from your web app in manner that doesn't load up the whole page, it is useful for sending requests then dynamically changing your page.</p>
<p>With plain javascript a AJAX object can be initialised using the new keyword as follows: <code>var xhttp = new XMLHttpRequest();</code>.</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="jquerys-ajax">JQuery's AJAX<a href="https://letspretend.netlify.app/blog/jquery-data-type#jquerys-ajax" class="hash-link" aria-label="Direct link to JQuery's AJAX" title="Direct link to JQuery's AJAX">​</a></h5>
<p>JQuery has a way to use AJAX functionality without needing to initiliaze the <code>XLMHttpRequest</code> which may become tedious real fast. To do that we have a <code>$.ajax({...})</code> where we give our ajax method some values as follows:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token doctype punctuation" style="color:hsl(119, 34%, 47%)">&lt;!</span><span class="token doctype doctype-tag" style="color:hsl(230, 8%, 24%)">DOCTYPE</span><span class="token doctype" style="color:hsl(230, 8%, 24%)"> </span><span class="token doctype name" style="color:hsl(230, 8%, 24%)">html</span><span class="token doctype punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">html</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">head</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">src</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(119, 34%, 47%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag attr-value" style="color:hsl(119, 34%, 47%)">https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">$</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript dom variable" style="color:hsl(221, 87%, 60%)">document</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">ready</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">function</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">        $</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">ajax</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript literal-property property" style="color:hsl(5, 74%, 59%)">url</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"https://jsonplaceholder.typicode.com/posts"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript literal-property property" style="color:hsl(5, 74%, 59%)">method</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"GET"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript literal-property property" style="color:hsl(5, 74%, 59%)">dataType</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> json</span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript function-variable function" style="color:hsl(221, 87%, 60%)">beforeSend</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">function</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">                </span><span class="token script language-javascript console class-name" style="color:hsl(35, 99%, 36%)">console</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">log</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"loading"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript function-variable function" style="color:hsl(221, 87%, 60%)">success</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">function</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript parameter">result</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">                </span><span class="token script language-javascript console class-name" style="color:hsl(35, 99%, 36%)">console</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">log</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript">result</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">                </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">$</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"body"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">append</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"&lt;p&gt;Data received!&lt;/p&gt;"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript function-variable function" style="color:hsl(221, 87%, 60%)">error</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">function</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript parameter">error</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">                </span><span class="token script language-javascript console class-name" style="color:hsl(35, 99%, 36%)">console</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">log</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript">error</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">                </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">$</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"body"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">append</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"&lt;p&gt;An error occurred.&lt;/p&gt;"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">        </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">head</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">body</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">body</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">html</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><br></span></code></pre></div></div>
<p>I served the above HTML with <code>npx server</code> and got the follwing result:
<img decoding="async" loading="lazy" alt="jquery-call" src="https://letspretend.netlify.app/assets/images/send-jquery-to-get-json-back-c603b3b4a5f0f3e599873e7113f88a58.png" width="1043" height="557" class="img_ev3q"></p>
<p>The json we passed in the <code>$.ajax({...})</code> method had the following properties and here's what they mean:</p>
<ul>
<li>url: this is url where we want to send our call.</li>
<li>method: HTTP method like GET, POST, PUT and DELETE</li>
<li>dataType: the expected data type from the response.</li>
<li>beforeSend: function that will be executed right before sending the call.</li>
<li>success: function to execute on success. This includes responses with with 2xx, 3xx.</li>
<li>error: function to execute for non-success calls or failures to read/process responses. Example: 4xx, 5xx.</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>If you need to specify certain headers in your AJAX call you can specify <code>header</code> prop in the object passed to the $.ajax method. Have a look at the JQuery <a href="https://api.jquery.com/jQuery.ajax/" target="_blank" rel="noopener noreferrer">site</a> for more info.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="jquery-mistaking-your-success-as-error">JQuery "mistaking" your success as error<a href="https://letspretend.netlify.app/blog/jquery-data-type#jquery-mistaking-your-success-as-error" class="hash-link" aria-label="Direct link to JQuery &quot;mistaking&quot; your success as error" title="Direct link to JQuery &quot;mistaking&quot; your success as error">​</a></h3>
<p>If you can notice I put mistaking in qoutes because it's not really mistaking, but rather something we can easily miss.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="cause-of-mistaking-success-with-error">Cause of "mistaking" success with error<a href="https://letspretend.netlify.app/blog/jquery-data-type#cause-of-mistaking-success-with-error" class="hash-link" aria-label="Direct link to Cause of &quot;mistaking&quot; success with error" title="Direct link to Cause of &quot;mistaking&quot; success with error">​</a></h4>
<p>There is a case that is easy to miss that may cause JQuery AJAX call to think a success call has failed. <strong>This happens when we specify the wrong dataType</strong>.</p>
<p>So if I am expecting a json response and my server sends me a 200 HTTP Status Code with html content this will classified as an error but there won't be any log to let me know. The reason this becomes an error is because by telling JQuery you expect json it will try to parse the response for you and if it fails even though the response 200 OK, it will just go to the <code>error function</code>.</p>
<p>To illustrate this, I have create an html page that just has an h1 tag as follow:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token doctype punctuation" style="color:hsl(119, 34%, 47%)">&lt;!</span><span class="token doctype doctype-tag" style="color:hsl(230, 8%, 24%)">DOCTYPE</span><span class="token doctype" style="color:hsl(230, 8%, 24%)"> </span><span class="token doctype name" style="color:hsl(230, 8%, 24%)">html</span><span class="token doctype punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">html</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">body</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">h1</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain">About Page For Blog</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">h1</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">body</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">html</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><br></span></code></pre></div></div>
<p>Which simply shows this:<br>
<img decoding="async" loading="lazy" alt="about-page" src="https://letspretend.netlify.app/assets/images/about-page-70a2804b9680f043b37c0cd79875c654.png" width="548" height="338" class="img_ev3q"></p>
<p>This will be hosted on localhost:3000 same as my html with JQuery. Then I will do a call where I specify <code>dataType: json</code>, then do a call to get this new page. It's as follows:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token doctype punctuation" style="color:hsl(119, 34%, 47%)">&lt;!</span><span class="token doctype doctype-tag" style="color:hsl(230, 8%, 24%)">DOCTYPE</span><span class="token doctype" style="color:hsl(230, 8%, 24%)"> </span><span class="token doctype name" style="color:hsl(230, 8%, 24%)">html</span><span class="token doctype punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">html</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">head</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">src</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(119, 34%, 47%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag attr-value" style="color:hsl(119, 34%, 47%)">https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">$</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript dom variable" style="color:hsl(221, 87%, 60%)">document</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">ready</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">function</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">        $</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">ajax</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript literal-property property" style="color:hsl(5, 74%, 59%)">url</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"/about"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript literal-property property" style="color:hsl(5, 74%, 59%)">method</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"GET"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript literal-property property" style="color:hsl(5, 74%, 59%)">dataType</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"json"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript function-variable function" style="color:hsl(221, 87%, 60%)">beforeSend</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">function</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">                </span><span class="token script language-javascript console class-name" style="color:hsl(35, 99%, 36%)">console</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">log</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"loading"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript function-variable function" style="color:hsl(221, 87%, 60%)">success</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">function</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript parameter">result</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">                </span><span class="token script language-javascript console class-name" style="color:hsl(35, 99%, 36%)">console</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">log</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript">result</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">                </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">$</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"body"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">append</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"&lt;p&gt;Data received!&lt;/p&gt;"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript function-variable function" style="color:hsl(221, 87%, 60%)">error</span><span class="token script language-javascript operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token script language-javascript"> </span><span class="token script language-javascript keyword" style="color:hsl(301, 63%, 40%)">function</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript parameter">error</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">                </span><span class="token script language-javascript console class-name" style="color:hsl(35, 99%, 36%)">console</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">log</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript">error</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">                </span><span class="token script language-javascript function" style="color:hsl(221, 87%, 60%)">$</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"body"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token script language-javascript method function property-access" style="color:hsl(221, 87%, 60%)">append</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token script language-javascript string" style="color:hsl(119, 34%, 47%)">"&lt;p&gt;An error occurred.&lt;/p&gt;"</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">            </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">        </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token script language-javascript punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">head</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">body</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">body</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">html</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><br></span></code></pre></div></div>
<p>The result:
<img decoding="async" loading="lazy" alt="send-fail" src="https://letspretend.netlify.app/assets/images/send-jquery-fail-6c1f4893d18fdf7d4aad697015494eaf.png" width="1298" height="527" class="img_ev3q"></p>
<p>As you can see the <code>responseText</code> which serves as the content of the response is an html about page and <code>status</code> is OK from the part we logged in the console, yet JQuery goes to error hence we see our body appended with <strong>An error occurred</strong> message.</p>
<p>Again this because we told JQuery: "hey, I am sending an HTTP request and the server must give me back data with dataType json as a response". Then JQuery tries to be nice and parse your responseText for you then it fails, hence calling the error function. So how do we fix this?</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Before fixing, I'd like to add that, this isn't a bug by JQuery but rather a feature to make sure your data returned is what you expected so you can maybe do some operations on the JSON response and this again highlights something. The error function is not a function only for failed calls i.e. 500, 400 etc. It is also called by JQuery for process/parse failures so it's good to keep that in mind.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-fix">The "fix"<a href="https://letspretend.netlify.app/blog/jquery-data-type#the-fix" class="hash-link" aria-label="Direct link to The &quot;fix&quot;" title="Direct link to The &quot;fix&quot;">​</a></h3>
<p>To fix this we would need to change the dataType from <code>json</code> to <code>html</code>. That would stop JQuery from trying to parse your html response into json and calling the error method on failure, it is that simple.</p>
<p>But what if for some reason you are calling an endpoint that can potentially give you both html and json? What do you do then? simple, if we don't specify the <code>dataType</code> value JQuery's Ajax won't even bother to try and parse our response in any way.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>It's better to have dataType specified if we know what type of data we want from the server but if we can get more than one dataType just don't specify it.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion.<a href="https://letspretend.netlify.app/blog/jquery-data-type#conclusion" class="hash-link" aria-label="Direct link to Conclusion." title="Direct link to Conclusion.">​</a></h3>
<p>This is it for the blog post. Here are some important points we went through:</p>
<ul>
<li>JQuery is library that allows us to do DOM manipulation using the function <code>$(&lt;html-selector&gt;)</code> to make our web application dynamic</li>
<li>AJAX is a means of sending HTTP server requests without loading the whole page.</li>
<li>JQuery has an AJAX method built into it accessed by <code>$.ajax({...})</code></li>
<li><code>dataType</code> is useful for specifying what kind of data we expect back, if not specified JQuery accepts any kind of response.</li>
<li><code>error</code> function is not called when we have HTTP status failures only but rather when JQuery fails to process our server response in anyway.</li>
</ul>
<p>Keep pretending, until next time!</p>]]></content:encoded>
            <category>jquery</category>
            <category>ajax</category>
            <category>dataType</category>
            <category>API</category>
        </item>
        <item>
            <title><![CDATA[ReactJs Library]]></title>
            <link>https://letspretend.netlify.app/blog/react-bare-bones</link>
            <guid>https://letspretend.netlify.app/blog/react-bare-bones</guid>
            <pubDate>Fri, 01 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Welcome to another blog post on Let's Pretend Blog! In this post, we will look at ReactJs as it is, without the create-react-app template. Just a mini blog to appreciate why ReactJS is purely just an abstraction of the DOM object and see how a simple component can be built.]]></description>
            <content:encoded><![CDATA[<p>Welcome to another blog post on Let's Pretend Blog! In this post, we will look at ReactJs as it is, without the create-react-app template. Just a mini blog to appreciate why ReactJS is purely just an abstraction of the DOM object and see how a simple component can be built.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="topics">Topics<a href="https://letspretend.netlify.app/blog/react-bare-bones#topics" class="hash-link" aria-label="Direct link to Topics" title="Direct link to Topics">​</a></h2>
<ul>
<li>Introduction</li>
<li>What is React, from a library viewpoint?</li>
<li>If Not A Framework then WHAT IS REACT?</li>
<li>Making my React App</li>
<li>Conclusion</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="https://letspretend.netlify.app/blog/react-bare-bones#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h2>
<p>React is a popular JavaScript library for building user interfaces. It allows developers to create reusable UI components and efficiently update the UI when the underlying data changes.</p>
<p>Let's get started!</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-react-from-a-library-viewpoint">What is React, from a library viewpoint?<a href="https://letspretend.netlify.app/blog/react-bare-bones#what-is-react-from-a-library-viewpoint" class="hash-link" aria-label="Direct link to What is React, from a library viewpoint?" title="Direct link to What is React, from a library viewpoint?">​</a></h2>
<p>I have had problems with understanding why people would refer to React as a library and not a framework and knowing my little lack of knowledge of front-end technologies, I'd just not stress myself being such conversations. You'd hear people say "React is not a full framework, I don't like working with it" or "Angular is better it's feature-rich, it has routing built into, a clear design in mind (MVC)"</p>
<p>And I'd be confused until I met this beaut here <a href="https://www.manning.com/books/react-quickly-second-edition" target="_blank" rel="noopener noreferrer">React Quickly</a>. Then I got a clear understanding of what React is.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-problem-is-react-solving">What Problem Is React Solving?<a href="https://letspretend.netlify.app/blog/react-bare-bones#what-problem-is-react-solving" class="hash-link" aria-label="Direct link to What Problem Is React Solving?" title="Direct link to What Problem Is React Solving?">​</a></h2>
<p>As mentioned in the introduction React focuses on building reusable UI components that change as the state of the data changes, what does this mean? It just means React isn't a framework that is there to help with state management, routing, etc. It is just a means to have reusable and dynamic UI, that's about it.</p>
<p>Yes react can be extendible with other libraries like <code>React Router</code>, and <code>Redux</code> to name a few. These libraries along with React can form an ecosystem that can mimic and compete with fully fleshed UI frameworks like Angular and Vue.Js.</p>
<p>This is one of the reasons the model of React is state-centric, by this I mean the interactivity of UI components built in React is tightly coupled with the state changing, hence <a href="https://react.dev/reference/react/hooks" target="_blank" rel="noopener noreferrer">hooks</a> like <a href="https://react.dev/reference/react/useEffect" target="_blank" rel="noopener noreferrer">useEffect</a> have things like dependencies to fire the hook whenever data changes.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="if-not-a-framework-then-what-is-react">If Not A Framework then WHAT IS REACT?<a href="https://letspretend.netlify.app/blog/react-bare-bones#if-not-a-framework-then-what-is-react" class="hash-link" aria-label="Direct link to If Not A Framework then WHAT IS REACT?" title="Direct link to If Not A Framework then WHAT IS REACT?">​</a></h2>
<p>To demonstrate fully what is react, we are going to build a mini project that will just show us how we can run react without the famous and useful <code>create-react-app</code> package which templates our application and helps create a web server for us and also creates a beautiful folder structure for us.</p>
<p>To start please create an empty HTML file in a directory, I named my directory <code>react-bare-bones</code> and have an index.html file such that I have the directory path <code>react-bare-bones/index.html</code>.</p>
<p>preferably have <code>Node.Js</code> installed (we will need it for our web server but any server can be used). This is how my HTML file will look like:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token doctype punctuation" style="color:hsl(119, 34%, 47%)">&lt;!</span><span class="token doctype doctype-tag" style="color:hsl(230, 8%, 24%)">DOCTYPE</span><span class="token doctype" style="color:hsl(230, 8%, 24%)"> </span><span class="token doctype name" style="color:hsl(230, 8%, 24%)">html</span><span class="token doctype punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">html</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">head</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">title</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain">React Bare Bones</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">title</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">head</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">body</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">div</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(119, 34%, 47%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag attr-value" style="color:hsl(119, 34%, 47%)">root</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">div</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">body</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript">    </span><span class="token script language-javascript comment" style="color:hsl(230, 4%, 64%)">//where my React code will be</span><span class="token script language-javascript"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token script language-javascript"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">html</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><br></span></code></pre></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="reactdom-and-react-libraries">ReactDom and React libraries.<a href="https://letspretend.netlify.app/blog/react-bare-bones#reactdom-and-react-libraries" class="hash-link" aria-label="Direct link to ReactDom and React libraries." title="Direct link to ReactDom and React libraries.">​</a></h4>
<p>For us to have React capabilities on our website we would need to import the following libraries: <a href="https://unpkg.com/react-dom@18/umd/react-dom.development.js" target="_blank" rel="noopener noreferrer">ReactDOM</a> and <a href="https://unpkg.com/react@18/umd/react.development.js" target="_blank" rel="noopener noreferrer">React</a>. These two classes/libs are important for the following reasons:</p>
<ul>
<li>The <code>React</code> class helps us with the capability to create React elements these elements may be well-known HTML elements like <code>h1</code>, <code>p</code>, <code>div</code>, or our custom components.</li>
<li>The <code>ReactDOM</code> class creates an abstraction of the DOM object and helps create the root container of our React application, that is, a container where all our React-rendered elements/components will reside. It also has the render method that will render our app in the DOM.</li>
</ul>
<p>To add these two classes in our HTML file, which we use adding React to our website would require us to add this in our header tag:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">head</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">title</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain">React Bare Bones</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">title</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">crossorigin</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">src</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(119, 34%, 47%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag attr-value" style="color:hsl(119, 34%, 47%)">https://unpkg.com/react@18/umd/react.development.js</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">crossorigin</span><span class="token tag" style="color:hsl(5, 74%, 59%)"> </span><span class="token tag attr-name" style="color:hsl(35, 99%, 36%)">src</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(119, 34%, 47%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag attr-value" style="color:hsl(119, 34%, 47%)">https://unpkg.com/react-dom@18/umd/react-dom.development.js</span><span class="token tag attr-value punctuation" style="color:hsl(119, 34%, 47%)">"</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token script"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">script</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&lt;/</span><span class="token tag" style="color:hsl(5, 74%, 59%)">head</span><span class="token tag punctuation" style="color:hsl(119, 34%, 47%)">&gt;</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>I know I used the word element to define the HTML tags like h1 and p. In React any small building block that can be reused and created via the React.createElement(...) (which we will see in action) is referred to as an element/component.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="making-my-react-app">Making my React App<a href="https://letspretend.netlify.app/blog/react-bare-bones#making-my-react-app" class="hash-link" aria-label="Direct link to Making my React App" title="Direct link to Making my React App">​</a></h2>
<p>In this section, we will add some React into our app and can't create a simple Hello, World Website. Assuming you have added the cdn references to the <code>index.html</code> file we can proceed to add our React code in the script.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="react-element">React Element<a href="https://letspretend.netlify.app/blog/react-bare-bones#react-element" class="hash-link" aria-label="Direct link to React Element" title="Direct link to React Element">​</a></h4>
<p>To create the React element we will add the following line in our script:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> reacth1Element </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token maybe-class-name">React</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">createElement</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">'h1'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword null nil" style="color:hsl(301, 63%, 40%)">null</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">'Hello World'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>The createElement takes in three arguments:</p>
<ul>
<li><code>type</code> is a string that represents a component that we want to render like <code>h1</code>, <code>div</code>, <code>p</code>, or our custom component.</li>
<li><code>data</code> would represent the data we want to pass to the component/element. This is also referred to as props, short for properties. In this mini example, we don't need props hence the null.</li>
<li><code>...children</code> is the list of children of the component in this case the h1 tage would have the text as the only child.</li>
</ul>
<p>This would allow us to create a React element but we need a place to render this element.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="rendering-the-react-element">Rendering the React Element.<a href="https://letspretend.netlify.app/blog/react-bare-bones#rendering-the-react-element" class="hash-link" aria-label="Direct link to Rendering the React Element." title="Direct link to Rendering the React Element.">​</a></h4>
<p>To render the element we will need a container to place our React application, we will use our <code>div</code> with <code>id="root"</code> like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> divNode </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token dom variable" style="color:hsl(221, 87%, 60%)">document</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">getElementById</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">'root'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>This is a just vanilla javascript line to get the div's object instance in the DOM.</p>
<p>Will then need to set this as the root element in our React virtual DOM using this line:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> reactAppRoot </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token maybe-class-name">ReactDOM</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">createRoot</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">divNode</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>This will create our React App Node but if we were to run our web server now, nothing would be rendered because we just created the root but didn't render it on the DOM, to do so we will do the following:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">reactAppRoot</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">render</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">reacth1Element</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>The render method takes in a react element to be displayed.</p>
<p>The complete file would look like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">!</span><span class="token constant" style="color:hsl(35, 99%, 36%)">DOCTYPE</span><span class="token plain"> html</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">html</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">head</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">title</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">React</span><span class="token plain"> </span><span class="token maybe-class-name">Bare</span><span class="token plain"> </span><span class="token maybe-class-name">Bones</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">title</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">script crossorigin src</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token string" style="color:hsl(119, 34%, 47%)">"https://unpkg.com/react@18/umd/react.development.js"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">script</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">script crossorigin src</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token string" style="color:hsl(119, 34%, 47%)">"https://unpkg.com/react-dom@18/umd/react-dom.development.js"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">script</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">head</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">body</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">div id</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token string" style="color:hsl(119, 34%, 47%)">"root"</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">div</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">body</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">script</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> reacth1Element </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token maybe-class-name">React</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">createElement</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">'h1'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword null nil" style="color:hsl(301, 63%, 40%)">null</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">'Hello World'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> divNode </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token dom variable" style="color:hsl(221, 87%, 60%)">document</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">getElementById</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">'root'</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> reactAppRoot </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token maybe-class-name">ReactDOM</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">createRoot</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">divNode</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    reactAppRoot</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">render</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">reacth1Element</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">script</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">html</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>The above would be enough to get your React app running, but first, we need to create a web server to host our beautiful website.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="web-server-with-nodejs">Web Server with Node.Js<a href="https://letspretend.netlify.app/blog/react-bare-bones#web-server-with-nodejs" class="hash-link" aria-label="Direct link to Web Server with Node.Js" title="Direct link to Web Server with Node.Js">​</a></h4>
<p>I have Node installed in my machine so I will just use that to host my site. Here's how I will do it:</p>
<ul>
<li>open the terminal in my working directory, i.e. directory with <code>index.html</code></li>
<li>run <code>npx serve</code> this will serve up the HTML in the working directory.</li>
<li>A URL with a port number will be shown in the terminal that you can follow and see your website.</li>
</ul>
<p>The Result should be something like this:
<img decoding="async" loading="lazy" src="https://letspretend.netlify.app/assets/images/hello-world-react-42154a5c42229fbfe031ba7e081ba11f.png" width="1275" height="672" class="img_ev3q"></p>
<p>As you can see the <code>div</code> now has the h1 tag and we didn't template this or write it in a markdown format just pure Javascripting!! and no <code>react-create-app</code>.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>React uses what we call <a href="https://legacy.reactjs.org/docs/introducing-jsx.html" target="_blank" rel="noopener noreferrer">JSX</a> to create react elements in an XML-like syntax, this is pure javascript that looks like XML. It is mostly used instead of using React.createElement. I didn't focus on that here because I wanted to show the appreciation of React just being a javascript UI library and nothing more.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion.<a href="https://letspretend.netlify.app/blog/react-bare-bones#conclusion" class="hash-link" aria-label="Direct link to Conclusion." title="Direct link to Conclusion.">​</a></h2>
<p>Just to close this, here's a quick recap of what we covered:</p>
<ul>
<li>React is a library and not a framework.</li>
<li>React focuses on building dynamic UI components.</li>
<li>You just need JavaScript and the relevant libraries that have ReactDom and React to build your web app.</li>
<li>react-create-app is a template library and not part of React.</li>
</ul>
<p>Until next time! keep pretending until you are not 😁. Bye!!</p>]]></content:encoded>
            <category>React</category>
            <category>Javascript</category>
        </item>
        <item>
            <title><![CDATA[OAuth With Authorization Code Flow]]></title>
            <link>https://letspretend.netlify.app/blog/oauth-auth-code-flow</link>
            <guid>https://letspretend.netlify.app/blog/oauth-auth-code-flow</guid>
            <pubDate>Sun, 01 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Hello there, I recently started reading about OAuth and trying to understand it as a framework idenpendent of a coding framework/SDK/Package and/or 3rd party offerings.]]></description>
            <content:encoded><![CDATA[<p>Hello there, I recently started reading about OAuth and trying to understand it as a framework idenpendent of a coding framework/SDK/Package and/or 3rd party offerings.<br>
<!-- -->In this post I will be talking about the OAuth Authorization Code Flow and why I think it is just an amazing framework for delegating user data, sit back and relax as we pretend our way through OAuth.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="topics">Topics<a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#topics" class="hash-link" aria-label="Direct link to Topics" title="Direct link to Topics">​</a></h3>
<ul>
<li><a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#what-is-oauth">What is OAuth?</a></li>
<li><a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#actors-in-oauth">Actors In OAuth</a></li>
<li><a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#problem-oauth-is-solving-replaying-password">Problem OAuth Is Solving</a></li>
<li><a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#oauth-authorization-code-flow">OAuth Flow: Authorization Code Flow</a></li>
<li><a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#how-authorization-code-flow-works">How Authorization Code Flow Works</a></li>
<li><a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#1-getting-authorization-code">Getting Authorization Code</a></li>
<li><a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#2-getting-the-access-token">Getting The Access Token</a></li>
<li><a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#3-calling-the-protected-resource">Calling the Protected Resource</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-oauth">What is OAuth?<a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#what-is-oauth" class="hash-link" aria-label="Direct link to What is OAuth?" title="Direct link to What is OAuth?">​</a></h3>
<p>Open Authentication commonly referred to as OAuth is a means of authenticating an application to access a resource owner's data from a different application.
It provides a standardized framework that allows this data sharing to be secure, easily adoptable and easily extensible, while providing flows that make sense for different use cases like mobile, native or web applications to name a few.</p>
<p>To understand what is OAuth we will need to travel a while back in time and see what kind of problem OAuth was trying to solve in the first place.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="actors-in-oauth">Actors In OAuth<a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#actors-in-oauth" class="hash-link" aria-label="Direct link to Actors In OAuth" title="Direct link to Actors In OAuth">​</a></h4>
<p>In this small section I will just add terms to some actors that are involved in OAuth:
<img decoding="async" loading="lazy" alt="oauth-actors" src="https://letspretend.netlify.app/assets/images/oauth-actors-96e3e606aae5e77e525bca09f0055f92.png" width="537" height="131" class="img_ev3q"></p>
<ul>
<li><code>Resource Owner</code> - This is the person/entity that owns the data we are interested in.</li>
<li><code>Client</code> - This is the application that wants to access the resource owner's data. An example would be an application that wants to view your Spotify data to maybe show most played songs in the last week.</li>
<li><code>Authorization Server</code> - Is an important piece in OAuth, this is the component that is responsible for authenticating the resource owner and issuing out tokens to client applications.</li>
<li><code>Protected Resource</code> - This is where the requested data resides, this will be thought to be an REST API in this blog post.</li>
</ul>
<p>We will come back to these later and explain their role in OAuth for now let's keep the terms in mind. Now let's look at how exposing a resource owner's data in another application looked like before OAuth.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="problem-oauth-is-solving-replaying-password">Problem OAuth is Solving: Replaying Password<a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#problem-oauth-is-solving-replaying-password" class="hash-link" aria-label="Direct link to Problem OAuth is Solving: Replaying Password" title="Direct link to Problem OAuth is Solving: Replaying Password">​</a></h4>
<p>In the olden days if a client wanted to access data on behalf of the user, the user would need to give their password and username to the client so that the client can replay signing in as the user as shown below:
<img decoding="async" loading="lazy" alt="oauth-password-replay" src="https://letspretend.netlify.app/assets/images/oauth-password-replaying-5f8832e2d9c2f3fba92b981fc1eeeeb6.png" width="963" height="212" class="img_ev3q"></p>
<p>This has a lot of security implications what if the client loses your credentials and they end up in the wrong hands?</p>
<p>Another security implication would be the resource application has no way of distinguishing between the resource owner and the client. Another one is, since the client signs in as the resource owner, they also have access to resources that they shouldn't and can perform more actions like deleting, modifying and sharing resources when they shouldn't.</p>
<p>The above problem is one the big reasons OAuth was implemented: for scoping application's permissions on the resource owner's content and making sure there is no credentials sharing that can expose the resource owner to potential malicious acts.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="oauth-authorization-code-flow">OAuth: Authorization Code Flow<a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#oauth-authorization-code-flow" class="hash-link" aria-label="Direct link to OAuth: Authorization Code Flow" title="Direct link to OAuth: Authorization Code Flow">​</a></h2>
<p>In OAuth we have different ways to implement delegation of the resource owner's data, this is usually refered to as an <code>OAuth Flow</code>. Different flows are useful for differnt user cases, we will be looking at the <a href="https://datatracker.ietf.org/doc/html/rfc6749#section-1.3.1" target="_blank" rel="noopener noreferrer">authorization code flow</a>. This flow is useful for Web Application that want access to the resource owner's content, it's ideal if the Web Application doesn't run on the browser like a SPA application or isn't a native application, this is more suitable for REST APIs or server rendered web apps.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The reason Authorization Code Flow is useful for Web Apps running on a remote server is because there is some compile time configuration like client secrets that the server needs to have in order to exchange it's code for an access token. This can be hard to be achieved in javascript clients running on the browser because we can't hide these secrets from the browser, please see <a href="https://datatracker.ietf.org/doc/html/rfc6749#section-1.3.2" target="_blank" rel="noopener noreferrer">Implict Grant Flow</a> for this use case or we can use <code>Dynamic Client Registration</code> to generate secrets at runtime.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-authorization-code-flow-works">How Authorization Code Flow Works<a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#how-authorization-code-flow-works" class="hash-link" aria-label="Direct link to How Authorization Code Flow Works" title="Direct link to How Authorization Code Flow Works">​</a></h3>
<p>In the simplest terms for this flow to work, the resource owner has to authorize the client's request to access their data. The client should know what kind of rights (scopes) they need. When they have been authorized a code will be given to the client known as the <code>authorization code</code>.<br>
<!-- -->The client will then need to ask the authorization server to exchange the authorization code with an <code>access token</code>. An access token will then allow the client to send a request to the <code>Protected Resources</code> endpoint.</p>
<p>This is just a simple overview let's see how that can be achieved. With the below diagrams. We will talk through each important processes piece by piece to form the whole picture.</p>
<p>For the below example we will assume the client is using the browser to communicate with the other actors and the client is registered to use the OAuth capabilities offered by the authorization server and protected resources endpoints. This means the client has some identity and configurations against it in the authorization server.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="1-getting-authorization-code">1. Getting Authorization Code:<a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#1-getting-authorization-code" class="hash-link" aria-label="Direct link to 1. Getting Authorization Code:" title="Direct link to 1. Getting Authorization Code:">​</a></h4>
<p><img decoding="async" loading="lazy" alt="oauth-get-oauth-code" src="https://letspretend.netlify.app/assets/images/oauth_code_auth_client-b347f072dcc5f55807cf0562afe3f3ab.png" width="1037" height="594" class="img_ev3q"></p>
<ul>
<li>Firstly the resource owner will be asked by the application if they want the client to get resources on their behalf.</li>
<li>If they agree then step 1 is done.</li>
<li>The client will then redirect the resource owner to the Authorization Server with the following query parameters: <code>client_id</code>, <code>scopes</code>, <code>redirect_uri</code> and <code>response_type</code>appended on the redirect url.</li>
<li>the <code>response_type=code</code> indicates to the authorization server that the clients wants a authorization code thus using the authorization code flow.</li>
<li>The client will have had the <code>client_id</code> issued to them by the authorization server when the client registered to use the protected resources OpenAPI.</li>
<li>When the resource owner is redirected to the Authorization Server they will be asked to authenticate themselves with the authorization server, this all happens without the client application seeing anything thus no way to see the resource owner's credentials.</li>
<li>Once authenticated the resource owner will be presented with a page that shows the <code>scopes</code> that the client application needs to in order to perform whatever tasks it wants, at this point the resource owner can approve or reject this request.</li>
<li>If approved the authorization server will redirect the resource owner to the client's <code>redirect_uri</code> and append the authorization code on the url with the parameter <code>code</code> that will have some opeque code like <code>code=sgysbcAhbdfj...</code> which is authorization code.</li>
<li>The <code>redirect_uri</code> will have been the same redirect_uri sent on step 2 and the same as the one the client configured when it registered to use the OpenAPI. This adds a level of security because the authorization server will always redirect to the url the client knows and can read from, not that just anyone can inject their own redirect_uri.</li>
<li>The client doesn't need to understand the authorization code it just needs to know how to use it, that is exchange it for an access token.</li>
</ul>
<p>As seen above the client application and the authorization server communicate indirectly through redirects with the browser being the middle man. This separation is essential to OAuth because it makes the client a simple component in the framework and gives all the authentication and authorization related functionality to the Authorization Server.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>In the above example we didn't use the <code>state</code> parameter when redirecting the resource owner to the authorization server from the client application. The state parameter is a random string created by the client application. The authorization server should return this state value as-is unchanged on the redirect to the client application to help the client verify if the response from the authorization server has been untermpered with. This helps with preventing <a href="https://datatracker.ietf.org/doc/html/rfc6749#section-10.12" target="_blank" rel="noopener noreferrer">Cross-Site Request Forgery (CSRF)</a> attacks, please see the <a href="https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.1" target="_blank" rel="noopener noreferrer">specification</a> for more info.</p></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="2-getting-the-access-token">2. Getting The Access Token<a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#2-getting-the-access-token" class="hash-link" aria-label="Direct link to 2. Getting The Access Token" title="Direct link to 2. Getting The Access Token">​</a></h4>
<p>Once a client has the authorization code, the client will need to trade this for an access token. The client will typically have some kind of identity i.e. <code>client_id</code> and some <code>client_secret</code> that will be sent along with the authorization code. This will help the Authorization Server identify the client if it is to be trusted to be given the access token. Here is the flow:
<img decoding="async" loading="lazy" alt="oauth-exchange-code-for-token" src="https://letspretend.netlify.app/assets/images/oauth-exchange-code-for-token-b4096419999370d22bd6c9ca25ba7380.png" width="733" height="498" class="img_ev3q"></p>
<ul>
<li>The client would have extracted the authorization code from the redirect respond in <a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#1-getting-authorization-code">getting-authorization-code</a></li>
<li>Then send an HTTP request to the Authorization Server with it's <code>client_id</code> and <code>client_secret</code> as form of identitification. How this identification is done i.e. HTTP Basic Auth or some flow like client credentials, doesn't really matter as long as there is this identification.</li>
<li>The Authorization Server will process the request and do some checks to verify the code is still valid and check if the client is who they claim to be.</li>
<li>If all is well an access token we will be sent back to the client with some extra data like <code>expiration time</code>, <code>refresh token</code>. What kind of extra data the Authorization Server returns is totally up to the Authorization Server.</li>
<li>Once the client receives the access token which like the authorization code is opeque to the client, the client will be ready to make calls to <code>Protected Resource</code>.</li>
</ul>
<p>A nice thing about this flow is since the access token and authorization code is opeque, the client doesn't even know which user it is delegating for because it doesn't need to. It knows that it needs an access token that the Protected Resource can understand. This again just shows how OAuth has made the client as dump as possible to the point it can't easily leak or see the resource owner's sensitive information.</p>
<p>Another thing is since the Authorization Server oversees the access/auth responsibility the resource owner only needs to go to one place to revoke the access if needed. Now that is good security right there.</p>
<p>note:::
The client would have registered with the Authorization Server so that it can be able to delegate calls for the resource owners. Apon registration a <code>client_id</code>, <code>client_secret</code> and <code>redirect_uri</code> are configured for the client in the Authorization Server in some sense like manually, developer portal, etc.
:::</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="3-calling-the-protected-resource">3. Calling the Protected Resource<a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#3-calling-the-protected-resource" class="hash-link" aria-label="Direct link to 3. Calling the Protected Resource" title="Direct link to 3. Calling the Protected Resource">​</a></h4>
<p>Now that the client has the access token it can then use it to get the protected resources scoped to what <code>scope</code> was requested in the intial call to create the authorization code. The <code>Protected Resource</code> endpoints will have enough context to know which user the access token is for and what kind of data can the client ask for. The Protected Resource can even do extra validation to make sure the access token hasn't expired or been tempared with.</p>
<p>Here is the diagram:
<img decoding="async" loading="lazy" alt="cleint-get-resources" src="https://letspretend.netlify.app/assets/images/oauth-client-get-resources-89102753e08ef006f697604a0ff43f57.png" width="733" height="498" class="img_ev3q"></p>
<ul>
<li>The client will send a request to perform an action (read, edit, write, delete) with an access token attached to the request.</li>
<li>If the action is within the scopes of the access token and the access token is still valid, the Protected Resource will respond gracefully and fufil the request.</li>
<li>If the action is not within the scopes of the access token or the access token is not valid the Protected Resource will have to kick back.</li>
</ul>
<p>This will be all to get resources on behalf of a resource owner with OAuth's Authorization Code Flow.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://letspretend.netlify.app/blog/oauth-auth-code-flow#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>This is it for now, I think this gives us a better view of how OAuth works and yes, we didn't touch on other OAuth flows like Implict Grant Type, Client Credentials, PKCE flow. But hopefully this gave us a view on what OAuth is, what problem is it solving.</p>
<p>Just a recap, here are the points we touched on:</p>
<ul>
<li>OAuth is a framework designed to allow resource owners to give access to client applications to access their data in a controlled manner.</li>
<li>OAuth is built on HTTP and relys on technologies like redirects to create separation of what one actor can see, namely the resource owner and client application.</li>
<li>OAuth has flows or different implementation and Authorization Code Flow is one of them, this flow relys on a client creating an authorization code that describes the scope on which an access token will be scoped to, thus what actions can be performed with it.</li>
<li>OAuth introduces an Authorization Server which is responsible giving access token as of the user's consent.</li>
</ul>
<p>This is not the most detailed walk through of OAuth, if you are really interested in the indepths of the framework I'd suggest the following references:</p>
<ul>
<li><a href="https://livebook.manning.com/book/oauth-2-in-action" target="_blank" rel="noopener noreferrer">OAuth 2.0 in Action</a> book</li>
<li><a href="https://datatracker.ietf.org/doc/html/rfc6749" target="_blank" rel="noopener noreferrer">OAuth RFC Specification</a></li>
<li><a href="https://developer.okta.com/blog/2017/06/21/what-the-heck-is-oauth" target="_blank" rel="noopener noreferrer">Okta blog</a> has a overview of this</li>
<li><a href="https://oauth.net/2/" target="_blank" rel="noopener noreferrer">OAuth</a> has a good compiled sources</li>
</ul>
<p>I am hoping in the next blog post I will build a mini OAuth ecosystem just to see how this can be translated in code but until then keep pretending until you are not and happy coding.🚀</p>]]></content:encoded>
            <category>OAuth</category>
            <category>API</category>
            <category>Security</category>
        </item>
        <item>
            <title><![CDATA[Real Time Updates With SignalR]]></title>
            <link>https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr</link>
            <guid>https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr</guid>
            <pubDate>Tue, 01 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Hello there it's been a while since I did a blog post. In this post I will be looking into SignalR and it helping us do real time updates!]]></description>
            <content:encoded><![CDATA[<p>Hello there it's been a while since I did a blog post. In this post I will be looking into SignalR and it helping us do real time updates!
The code referenced here will be from this <a href="https://github.com/Takobz/signalr-example" target="_blank" rel="noopener noreferrer">repo</a></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="topics">Topics<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#topics" class="hash-link" aria-label="Direct link to Topics" title="Direct link to Topics">​</a></h3>
<ul>
<li>What is SignalR ?</li>
<li>Why Should I use it ?</li>
<li>A mini project with concepts: What are Hubs, Events and Methods in SignalR</li>
<li>Controller Configuration</li>
<li>Configuring A Client App</li>
<li>Causing An Event To Fire</li>
<li>Conclusion</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-signalr-">What is SignalR ?<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#what-is-signalr-" class="hash-link" aria-label="Direct link to What is SignalR ?" title="Direct link to What is SignalR ?">​</a></h3>
<p>Before we even start looking at SignalR I think it would be cool to understand what it is and what does it do.</p>
<p>SignalR is .NET's solution to allow servers to send information to clients as soon the change happens in the server. Both the client and the server can invoke methods on each other. This allows the server to call the client thus tell the client about the changes it is interested in. A client can subscribe to changes, called events.</p>
<p>The image below shows the typical architecture of SignalR:
<img decoding="async" loading="lazy" alt="siganlr-typical-architecture" src="https://letspretend.netlify.app/assets/images/siganlr-typical-architecture-dbc6c375d1bba13d23ccd0e4dac58b8a.png" width="488" height="444" class="img_ev3q"></p>
<p>The image above shows some of the fundamental parts of SignalR. We have a <code>server</code> that has SiganlR. Which in turns has a Hub which has Events and Methods. The connection is bi-directional meaning the server can call the client and vice-versa.</p>
<p>A <code>Hub</code> exposes our signalR endpoints. It enables clients to communicate with the server and vice-versa.</p>
<p><code>Events</code> are the type of actions that clients can subscribe to. So whenever an event happens in the server a client that is subscribed to it will get notified on change. Note that a client can subscribe to multiple events as we can see client 3 from the image.</p>
<p><code>Methods</code> these are functions on the server/Hub that can be called from the client side code. The client should provide the appropriate parameters and method name to invoke the correct method.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The Hub methods can be used to indirectly cause an event from the client on the server but they are not necessarily for firing events from a client but can be used for that function.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-should-i-use-it-">Why Should I use it ?<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#why-should-i-use-it-" class="hash-link" aria-label="Direct link to Why Should I use it ?" title="Direct link to Why Should I use it ?">​</a></h3>
<p>There are number of reasons to use SignalR but my number one take is live updates. If you have an app that needs to know of changes as soon as they happen (chat notification or live updates like order tracking) then you might need to consider SignalR.</p>
<p>Why? Well imagine you have an app that needs live data from your database as soon as the state of the database changes. One way to do this is polling, where your app will call the server every, say 60 seconds. This will definitely work until we have a lot requests to the server and potentially causing many request errors and slowing down our server.</p>
<p>Another big win is that clients can choose what is important to them and listen to those events and then inform other clients of their changes.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="a-mini-project-with-concepts-what-are-hubs-events-and-methods-in-signalr">A mini project with concepts: What are Hubs, Events and Methods in SignalR<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#a-mini-project-with-concepts-what-are-hubs-events-and-methods-in-signalr" class="hash-link" aria-label="Direct link to A mini project with concepts: What are Hubs, Events and Methods in SignalR" title="Direct link to A mini project with concepts: What are Hubs, Events and Methods in SignalR">​</a></h3>
<p>Now, the action! In this section we are going to explore some key conecpts with code snippets! 🐱‍🏍</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="problem-statement">Problem Statement:<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#problem-statement" class="hash-link" aria-label="Direct link to Problem Statement:" title="Direct link to Problem Statement:">​</a></h4>
<p>We want to have some frontent clients notified whenever a change happens on a certain table that we have in our database. So differnt client apps can subscribe to a signalR change event of any table they are interested in and we will notify them when there is a change.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="set-up">Set Up:<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#set-up" class="hash-link" aria-label="Direct link to Set Up:" title="Direct link to Set Up:">​</a></h4>
<p>The .NET Solution will have an ASP.NET Web API with .NET 7. The frontend will be a simple React App that just listens to events.
The database will be sqlite database, to query the database we are going to use Entity Framework Core. Simple stuff 😉.</p>
<p>Our server will be our ASP.NET Web API and our client a React App. It is worth a mention that a client app can also be another ASP.NET Web API.</p>
<p>Here is a mini diagram of flow:<br>
<img decoding="async" loading="lazy" alt="example-architecture" src="https://letspretend.netlify.app/assets/images/signalr-example-architecture-27a0e5579842d499930734c8fae68695.png" width="1125" height="677" class="img_ev3q"></p>
<p>We are simply going to have a controller that does a database table change then uses the Hub to fire an event that a table has changed.</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="set-up-signalr-in-aspnet">Set Up SignalR in ASP.NET:<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#set-up-signalr-in-aspnet" class="hash-link" aria-label="Direct link to Set Up SignalR in ASP.NET:" title="Direct link to Set Up SignalR in ASP.NET:">​</a></h5>
<ul>
<li>In our Program.cs file we need to add our hub dependencies to the service collections with this line: <code>builder.Services.AddSignalR()</code></li>
<li>Create <a href="https://github.com/Takobz/signalr-example/tree/main/signalr-example/Hubs" target="_blank" rel="noopener noreferrer">Hub folder</a> in the root of our project called Hubs as I did in my repo</li>
<li>Inside the folder create a file called <code>DatabaseHub.cs</code>. This folder will have our Hub class and interface that describes our events.</li>
<li>Then in our Program.cs we map a url to our Hub with this line: <code>app.MapHub&lt;DatabaseHub&gt;("/database-hub")</code> this means our hub url will be like this <code>https://localhost:&lt;port&gt;/database-hub</code></li>
</ul>
<p>This should be enough for a set-up no eventing yet but first steps.</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="hub-class">Hub Class<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#hub-class" class="hash-link" aria-label="Direct link to Hub Class" title="Direct link to Hub Class">​</a></h5>
<p>A Hub is a server concept in SignalR terms. It simply just represents a signalr server. This will be a normal c# class that extends from <code>Microsoft.AspNetCore.SignalR.Hub&lt;T&gt;</code></p>
<p>The Type <code>T</code> is an interface that has all the events the Hub can expose.</p>
<p>Hub Example:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">using </span><span class="token maybe-class-name">Microsoft</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">AspNetCore</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">SignalR</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">namespace </span><span class="token maybe-class-name">SignalRExample</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Hubs</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Hub</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">DatabaseHub</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token maybe-class-name">Hub</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">IDatabaseHubEvents</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//This is a method, it can be called from the client's code.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">async</span><span class="token plain"> </span><span class="token maybe-class-name">Task</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">NotifyAll</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">string clientName</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">       </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//I can cause an event in here by calling Clients property.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">       </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//or something unrelated to SignalR.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">interface</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">IDatabaseHubEvents</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Event we are going to fire when Product table changes.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token maybe-class-name">Task</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">ProductTableChanged</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">TableChangeModel</span><span class="token plain"> changeModel</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Event we are going to fire when Person table changes.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token maybe-class-name">Task</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">PersonTableChanged</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">PersonChangeModel</span><span class="token plain"> changeModel</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Just a model</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">TableChangeModel</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">TableName</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> int </span><span class="token maybe-class-name">ItemId</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">PersonChangeModel</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> int </span><span class="token maybe-class-name">PersonId</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">Name</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">Surname</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">ChangeReason</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>When an event <code>ProductTableChanged</code> is fired, clients that are subscribed to the event will receive a <code>TableChangeModel</code> object which has the data TableName and ItemId.</p>
<p>We will see how that is done on the client side later but for now. This will be enough. I want us to talk about the <code>Clients</code> property in Hubs namespace</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="signalr-hub-clients">SignalR Hub Clients<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#signalr-hub-clients" class="hash-link" aria-label="Direct link to SignalR Hub Clients" title="Direct link to SignalR Hub Clients">​</a></h5>
<p><code>IHubCallerClients&lt;T&gt; Clients</code> This property has the ability to call all clients that are subscribed to an event. It also has the capability to group client calls:</p>
<ul>
<li>Clients.All - calls all clients that are listening to an event.</li>
<li>Clients.Groups - calls a certain group of clients</li>
</ul>
<p>This is what we will use to cause events. We can edit the above code to be like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">DatabaseHub</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token maybe-class-name">Hub</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">DatabaseHubMethods</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Notify every client that subscribed to this event.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">async</span><span class="token plain"> </span><span class="token maybe-class-name">Task</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">NotifyAll</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter maybe-class-name">TableChangeModel</span><span class="token parameter"> changeModel</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Send changeModel to All subscribed clients</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Note we are causing an Event inside a Method, we don't need to do this all the time</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">       </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">await</span><span class="token plain"> </span><span class="token maybe-class-name">Clients</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">All</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">ProductTableChanged</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">changeModel</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>In this blog we are going to Call all clients for more info on how to scope SignalR events visit this <a href="https://learn.microsoft.com/en-us/aspnet/core/signalr/groups" target="_blank" rel="noopener noreferrer">Microsoft page</a>.</p></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="entity-framework-models">Entity Framework Models<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#entity-framework-models" class="hash-link" aria-label="Direct link to Entity Framework Models" title="Direct link to Entity Framework Models">​</a></h5>
<p>We will have simple EFCore models that represent tables in our database.</p>
<ul>
<li>ProductModel:</li>
</ul>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Product</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token maybe-class-name">Entity</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">ProductName</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">ProductDescription</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<ul>
<li>PersonModel:</li>
</ul>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Person</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token maybe-class-name">Entity</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">Name</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">Surname</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token maybe-class-name">UserName</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> string</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Empty</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<ul>
<li>Entity</li>
</ul>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Entity</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> int </span><span class="token maybe-class-name">Id</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> set</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>For Data Models and set up, please see <a href="https://github.com/Takobz/signalr-example" target="_blank" rel="noopener noreferrer">Repo</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="controller-configuration-">Controller Configuration 🔥<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#controller-configuration-" class="hash-link" aria-label="Direct link to Controller Configuration 🔥" title="Direct link to Controller Configuration 🔥">​</a></h2>
<p>For us to cause an event to fire we just need to call the <code>Clients.All.&lt;my-event-function&gt;</code> So we are going to create a Controller that can be POSTED to and then it will fire an event after a successful insert.</p>
<p>Here is the Controller:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token maybe-class-name">ApiController</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">Route</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"[controller]"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">SignalRController</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token maybe-class-name">ControllerBase</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">private</span><span class="token plain"> readonly </span><span class="token maybe-class-name">IHubContext</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">DatabaseHub</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token maybe-class-name">IDatabaseHubEvents</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> _dbHubContext</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">private</span><span class="token plain"> readonly </span><span class="token maybe-class-name">ISignalRDbContext</span><span class="token plain"> _signalRDbContext</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">SignalRController</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token parameter maybe-class-name">IHubContext</span><span class="token parameter operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token parameter maybe-class-name">DatabaseHub</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"> </span><span class="token parameter maybe-class-name">IDatabaseHubEvents</span><span class="token parameter operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token parameter"> dbHubContext</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token parameter">            </span><span class="token parameter maybe-class-name">ISignalRDbContext</span><span class="token parameter"> signalRDbContext</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//make sure you have registerd IDatabaseHubEvents in the DI container</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//i.e services.AddSingleton&lt;IDatabaseHubEvents, DatabaseHub&gt;()</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            _dbHubContext </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> dbHubContext</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            _signalRDbContext </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> signalRDbContext</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">Route</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"add-person"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token maybe-class-name">HttpPost</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">async</span><span class="token plain"> </span><span class="token maybe-class-name">Task</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">IActionResult</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">AddPerson</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">string name</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"> string surname</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> person </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Person</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token maybe-class-name">Name</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> name</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token maybe-class-name">Surname</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> surname</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token maybe-class-name">UserName</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> $</span><span class="token string" style="color:hsl(119, 34%, 47%)">"{Guid.NewGuid()}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token maybe-class-name">DatabaseResult</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">Person</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> result </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> _signalRDbContext</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddPerson</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">person</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">result</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Status</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">==</span><span class="token plain"> </span><span class="token maybe-class-name">Status</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Success</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> changeModel </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">PersonChangeModel</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                    </span><span class="token maybe-class-name">PersonId</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> person</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Id</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                    </span><span class="token maybe-class-name">Name</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> person</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Name</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                    </span><span class="token maybe-class-name">Surname</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> person</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Surname</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                    </span><span class="token maybe-class-name">ChangeReason</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"New Add"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Calling all clients and giving them the change model.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">await</span><span class="token plain"> _dbHubContext</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Clients</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">All</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">PersonTableChanged</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">changeModel</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">Ok</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"User Added and alerted subscribers!"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//generates appropriate response based on database result</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">Conflict</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>In the above we register our Hub via <code>IHubContext</code> interface and our <code>DbContext</code> that is behind an interface. The important line here is:<br>
<code>await _dbHubContext.Clients.All.PersonTableChanged(changeModel);</code> this lines calls subscribed clients by firing an event <code>ProductTableChanged</code> thus passing down the <code>PersonChangeModel</code> data to be used by all the subscribed clients.</p>
<p>And that's it, that's how you fire an event. For all the controller source code check out: <a href="https://github.com/Takobz/signalr-example/tree/main/signalr-example/Controllers" target="_blank" rel="noopener noreferrer">SignalR Example Repo</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="configurig-a-client-app">Configurig A Client App<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#configurig-a-client-app" class="hash-link" aria-label="Direct link to Configurig A Client App" title="Direct link to Configurig A Client App">​</a></h2>
<p>I will be using a React JS client but the concept should be the same for any other client app. This means we will need to install the package: <code>npm install microsoft/signalr</code>.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="subscribing-to-an-event">Subscribing To An Event.<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#subscribing-to-an-event" class="hash-link" aria-label="Direct link to Subscribing To An Event." title="Direct link to Subscribing To An Event.">​</a></h4>
<p>Clients subscribe to a hub event by specifing the hub <code>url</code> and the <code>event</code> they are interested in. This would be any event specified in your client's event interface, in my case any method specified in they <code>IDatabaseHubEvents</code> interface of my database Hub would be an event.</p>
<p>Let's see how the client app does it:</p>
<p>I created a service class to take care of my SignalR connectivity <a href="https://github.com/Takobz/signalr-example/blob/main/signalr-example-client/client-app/src/Services/SignalRHubService.js" target="_blank" rel="noopener noreferrer">SignalRHubService</a>. The class looks like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword module" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token imports operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token imports"> </span><span class="token imports keyword module" style="color:hsl(301, 63%, 40%)">as</span><span class="token imports"> </span><span class="token imports maybe-class-name">SignalR</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"@microsoft/signalr"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">SignalRHubService</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  connection </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword null nil" style="color:hsl(301, 63%, 40%)">null</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  tableEvents </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token string" style="color:hsl(119, 34%, 47%)">"PersonTableChanged"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"ProductTableChanged"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">startConnection</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">serverHubUrl</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">this</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">connection</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">SignalR</span><span class="token class-name punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token class-name" style="color:hsl(35, 99%, 36%)">HubConnectionBuilder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">withUrl</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">serverHubUrl</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">configureLogging</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">SignalR</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">LogLevel</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Information</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">build</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">this</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">connection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">start</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">catch</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">error</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token console class-name" style="color:hsl(35, 99%, 36%)">console</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">error</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">error</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">addTableChangeListner</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">tableEvent</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"> callback</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token keyword" style="color:hsl(301, 63%, 40%)">this</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">isEventAndConnectionValid</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">tableEvent</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">this</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">connection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">this</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">connection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">on</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">tableEvent</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">tableChangeModel</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token function" style="color:hsl(221, 87%, 60%)">callback</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">tableChangeModel</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">else</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token console class-name" style="color:hsl(35, 99%, 36%)">console</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">error</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Can't Add Listner with Invalid Connection or Event"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">isEventAndConnectionValid</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">tableEvent</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"> connection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token operator" style="color:hsl(221, 87%, 60%)">!</span><span class="token plain">connection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token console class-name" style="color:hsl(35, 99%, 36%)">console</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">error</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Can't Add Listner with Invalid Connection"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(35, 99%, 36%)">false</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token operator" style="color:hsl(221, 87%, 60%)">!</span><span class="token plain">tableEvent</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">includes</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">tableEvent</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token console class-name" style="color:hsl(35, 99%, 36%)">console</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">error</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Can't Add Listner For unknow event"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(35, 99%, 36%)">false</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(35, 99%, 36%)">true</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">export</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">default</span><span class="token plain"> </span><span class="token maybe-class-name">SignalRHubService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="start-connection">Start Connection<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#start-connection" class="hash-link" aria-label="Direct link to Start Connection" title="Direct link to Start Connection">​</a></h5>
<p>The function that is responsible for starting a SignalR connection thus creating a subscribtion to my signalR Hub is <code>startConnection</code>:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//serverHubUrl is the URL of SignalR server.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//In this example it will be the server that Host my ASP.NET Web API that has SignalR configured.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">startConnection</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">serverHubUrl</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">this</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">connection</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">SignalR</span><span class="token class-name punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token class-name" style="color:hsl(35, 99%, 36%)">HubConnectionBuilder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">withUrl</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">serverHubUrl</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">configureLogging</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">SignalR</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">LogLevel</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Information</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">build</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">this</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">connection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">start</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">catch</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">error</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token console class-name" style="color:hsl(35, 99%, 36%)">console</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">error</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">error</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>In the above example we are just building our SignalR connection. The SignalR class comes from the <code>microsoft/signalr</code> package. I pass the <code>serverHubUrl</code> this will the url where my SignalR Hub Server is hosted, the url must have the path to the Hub. As we will see in my <a href="https://github.com/Takobz/signalr-example/blob/6c7dac4bb9df64629fe157ed900f6d8b5dc94824/signalr-example-client/client-app/src/App.js#L11C77-L11C77" target="_blank" rel="noopener noreferrer">App.js</a> I used the url <code>http:localhost:5078/database-hub</code> as I have configured my .NET Web API to use path <code>database-hub</code> for signalR.</p>
<p>In my App.js I will just start a connection like this: <code>signalRHubService.startConnection("http://localhost:5078/database-hub");</code></p>
<p>If you check your Networks in dev tools, you will see something similar:
<img decoding="async" loading="lazy" src="https://letspretend.netlify.app/assets/images/signal-r-hub-connection-in-browser-cdd5b1dbb95eb98992dbfc8d6409017d.png" width="617" height="417" class="img_ev3q"></p>
<p>This indicates that the connection to the hub has been established. Now subscribing to an event.</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="subscribing-to-an-event-1">Subscribing To An Event<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#subscribing-to-an-event-1" class="hash-link" aria-label="Direct link to Subscribing To An Event" title="Direct link to Subscribing To An Event">​</a></h5>
<p>The function that is responsible for subscribing to an event is <a href="https://github.com/Takobz/signalr-example/blob/6c7dac4bb9df64629fe157ed900f6d8b5dc94824/signalr-example-client/client-app/src/Services/SignalRHubService.js#L18C3-L18C25" target="_blank" rel="noopener noreferrer">addTableChangeListner</a>:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">addTableChangeListner</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">tableEvent</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"> callback</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token keyword" style="color:hsl(301, 63%, 40%)">this</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">isEventAndConnectionValid</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">tableEvent</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">this</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">connection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">this</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">connection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">on</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">tableEvent</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">tableChangeModel</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token function" style="color:hsl(221, 87%, 60%)">callback</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">tableChangeModel</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">else</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token console class-name" style="color:hsl(35, 99%, 36%)">console</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">error</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Can't Add Listner with Invalid Connection or Event"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>This function takes in the event name which in my case can either be <code>PersonTableChanged</code> or <code>PersonTableChanged</code> then a callback method to handle the event. So when event <code>PersonTableChanged</code> happens the server will send a <code>PersonChangeModel</code> as described in the <code>IDatabaseHubEvents</code> the callback function will receive this object and do some work on it.</p>
<p>Here is how I handle an event in <a href="https://github.com/Takobz/signalr-example/blob/6c7dac4bb9df64629fe157ed900f6d8b5dc94824/signalr-example-client/client-app/src/App.js#L12C68-L12C85" target="_blank" rel="noopener noreferrer">App.js</a>:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//changes has all changes that happened since we subscribed to the person table changes.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//useState is a React function for creating state variables.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token plain">changes</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> setChanges</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">useState</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> signalRHubService </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">SignalRHubService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//useEffect is React's method for doing side effect work like calling APIs inside our component.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token function" style="color:hsl(221, 87%, 60%)">useEffect</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//create connection</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    signalRHubService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">startConnection</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"http://localhost:5078/database-hub"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//listen to event and update my state variable - changes.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    signalRHubService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">addTableChangeListner</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"PersonTableChanged"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">personChangeModel</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token function" style="color:hsl(221, 87%, 60%)">setChanges</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">prevChanges</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token spread operator" style="color:hsl(221, 87%, 60%)">...</span><span class="token plain">prevChanges</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> personChangeModel</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>In above we subscribe to an Events Hub hosted in my .NET Web API then we listen to any changes of the <code>PersonTableChanged</code> event.</p>
<p>Then in my <a href="https://github.com/Takobz/signalr-example/blob/6c7dac4bb9df64629fe157ed900f6d8b5dc94824/signalr-example-client/client-app/src/App.js#L23" target="_blank" rel="noopener noreferrer">App.js</a> I list the changes that have happended:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">div</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">ul</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">changes</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">map</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">change</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"> index</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">              </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">li key</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">index</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">b</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">Id</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">b</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">change</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">personId</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">b</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">Name</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&amp;</span><span class="token plain"> </span><span class="token maybe-class-name">Surname</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">b</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">change</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">name</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">change</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">surname</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">b</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">Change</span><span class="token plain"> </span><span class="token maybe-class-name">Reason</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">b</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">change</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">changeReason</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">              </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">li</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">ul</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">div</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><br></span></code></pre></div></div>
<p>This is how the list would look like (Don't judge my UI skills please! 😂):
<img decoding="async" loading="lazy" src="https://letspretend.netlify.app/assets/images/signalr-client-listing-changes-c6ad73da37eb220ec83637501c337a33.png" width="778" height="412" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="causing-an-event-to-fire-">Causing An Event To Fire 🚀<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#causing-an-event-to-fire-" class="hash-link" aria-label="Direct link to Causing An Event To Fire 🚀" title="Direct link to Causing An Event To Fire 🚀">​</a></h2>
<p>For us to receive any events will need the following:</p>
<ul>
<li>Run .NET Web API (using my localhost) by running <code>dotnet run</code> on my .NET CLI in directory that has my <a href="https://github.com/Takobz/signalr-example/blob/main/signalr-example/signalr-example.csproj" target="_blank" rel="noopener noreferrer">signalr-example.csproj</a></li>
<li>Run React App by running <code>npm start</code> in my command line, result:
<img decoding="async" loading="lazy" src="https://letspretend.netlify.app/assets/images/signalr-client-empty-11b311fa09a3603fcba3ea89f10dfbde.png" width="776" height="449" class="img_ev3q"></li>
<li>In Postman I will call my Web API to add a user:
<img decoding="async" loading="lazy" src="https://letspretend.netlify.app/assets/images/signalr-postman-pre-call-f2c249f760977e17ed3f66d1c3ff82d2.png" width="995" height="362" class="img_ev3q"></li>
<li>Calling the Web API will create a new Person and then fire the <code>PersonTableChanged</code> event:
<img decoding="async" loading="lazy" src="https://letspretend.netlify.app/assets/images/signalr-postman-call-web-api-81da302c3c12776b2c8fac4a8e2bcd7b.png" width="1206" height="569" class="img_ev3q"></li>
<li>The Client will receive an alert of the change:
<img decoding="async" loading="lazy" src="https://letspretend.netlify.app/assets/images/signalr-client-change-a3b072dd1b92415c635ed2a4a2652172.png" width="1095" height="811" class="img_ev3q"></li>
</ul>
<p>If you notice you can see my Hub sent the client app the name and parameters of the event. It did this via a WebSocket connection that was enstablished when we connected my client to the Hub. SignalR chooses the most optimal connection to make the client server communicate bi-directionally. <a href="https://learn.microsoft.com/en-us/aspnet/core/signalr/introduction?view=aspnetcore-7.0#transports" target="_blank" rel="noopener noreferrer">Here is Microsoft's word</a> on this!</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://letspretend.netlify.app/blog/real-time-updates-with-dotnet-signalr#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>In this blog post we covered:</p>
<ul>
<li>What is SignalR</li>
<li>What are Events, Methods, Hubs, Clients.</li>
<li>How to connect a client to a hub server</li>
<li>Listening to events from server in a client application.</li>
</ul>
<p>We didn't talk about invoking methods on the server from the client. <a href="https://learn.microsoft.com/en-us/aspnet/core/signalr/javascript-client?view=aspnetcore-7.0&amp;tabs=visual-studio#call-hub-methods-from-the-client" target="_blank" rel="noopener noreferrer">Here's a word from Microsoft</a> about this. I was just cautious that this will be lengthy blog.</p>
<p>Here is the <a href="https://github.com/Takobz/signalr-example/tree/main" target="_blank" rel="noopener noreferrer">Github Repo</a> with all the code</p>
<p>Anywho humans (and machines 🤖) until next time, keep pretending until you are not. Happy Coding. Bye!</p>]]></content:encoded>
            <category>SignalR</category>
            <category>Hubs</category>
            <category>RealTime</category>
            <category>CSharp</category>
            <category>.NET</category>
        </item>
        <item>
            <title><![CDATA[Passing data around in ReactJs]]></title>
            <link>https://letspretend.netlify.app/blog/passing-data-around-in-reactJs</link>
            <guid>https://letspretend.netlify.app/blog/passing-data-around-in-reactJs</guid>
            <pubDate>Thu, 01 Sep 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Hello, Reader! 🙂, It's been a while since I posted something.]]></description>
            <content:encoded><![CDATA[<p>Hello, Reader! 🙂, It's been a while since I posted something.<br>
<!-- -->In my quest to start with <a href="https://reactjs.org/" target="_blank" rel="noopener noreferrer">ReactJs</a> I found something interesting about passing data around from component to component and I want to talk about it because it was just amazing!</p>
<p>Without wasting any time let's dive straight into the concepts.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="topics">Topics:<a href="https://letspretend.netlify.app/blog/passing-data-around-in-reactJs#topics" class="hash-link" aria-label="Direct link to Topics:" title="Direct link to Topics:">​</a></h3>
<ul>
<li>A Component</li>
<li>Parent-Child Components</li>
<li>Ohh wow Props!</li>
<li>Event Props (looking at input tag)</li>
<li>Ohh Wait, Our Very Own Event Prop!</li>
<li>Conclusion</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="a-component">A Component<a href="https://letspretend.netlify.app/blog/passing-data-around-in-reactJs#a-component" class="hash-link" aria-label="Direct link to A Component" title="Direct link to A Component">​</a></h3>
<p>As you might know ReactJs uses components to build up it's user interface. A component can be anything ranging from a Card or a Widget that consists of a text input and a button or simply a div with text.</p>
<p>The idea of these components is to have UI elements that we can re-use  as we would with normal html tags like <code>div</code> <code>h1</code> etc.</p>
<p>Below is how a component is created in ReactJs. This component just renders the text <strong>Parent Component</strong> on the screen:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword module" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"react"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:hsl(221, 87%, 60%)">ParentComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">h1</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">Parent</span><span class="token plain"> </span><span class="token maybe-class-name">Component</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">h1</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">export</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">default</span><span class="token plain"> </span><span class="token maybe-class-name">ParentComponent</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>If we reference this component in the App.js we would do this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword module" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"./App.css"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">ParentComponent</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"./Components/ParentComponent"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">App</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">div</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">ParentComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">div</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">export</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">default</span><span class="token plain"> </span><span class="token maybe-class-name">App</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>We will see this:<br>
<img decoding="async" loading="lazy" alt="component-example" src="https://letspretend.netlify.app/assets/images/component-example-204c9f10dfd141e898f19263ed7480aa.PNG" width="588" height="391" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>To learn more about Components visit <a href="https://reactjs.org/docs/components-and-props.html" target="_blank" rel="noopener noreferrer">React site</a> 🙂</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="parent-child-components">Parent-Child Components<a href="https://letspretend.netlify.app/blog/passing-data-around-in-reactJs#parent-child-components" class="hash-link" aria-label="Direct link to Parent-Child Components" title="Direct link to Parent-Child Components">​</a></h3>
<p>If you noticed above I called the Parent Component inside the <code>return()</code> function of App.js (a component) this means that the Parent component is the child of the App.js component.</p>
<p>To make this a little clear I will create a component called ChildComponent and this will be called inside the Parent component. Here is how the child will look like:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword module" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"react"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:hsl(221, 87%, 60%)">ChildComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">h3</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">Hello</span><span class="token plain"> </span><span class="token constant" style="color:hsl(35, 99%, 36%)">I</span><span class="token plain"> am a child </span><span class="token maybe-class-name">Component</span><span class="token plain"> </span><span class="token maybe-class-name">Of</span><span class="token plain"> </span><span class="token maybe-class-name">ParentComponent</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">h3</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">export</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">default</span><span class="token plain"> </span><span class="token maybe-class-name">ChildComponent</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>In the parent component I will do this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword module" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"react"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">ChildComponent</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"./ChildComponent"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:hsl(221, 87%, 60%)">ParentComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">h1</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">Parent</span><span class="token plain"> </span><span class="token maybe-class-name">Component</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">h1</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">ChildComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">export</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">default</span><span class="token plain"> </span><span class="token maybe-class-name">ParentComponent</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>This will give me the result:<br>
<img decoding="async" loading="lazy" alt="child-in-parent" src="https://letspretend.netlify.app/assets/images/child-in-parent-21353ad2dffb3edbb4c570971707602b.PNG" width="614" height="363" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>In the ParentComponent I will just reference this file with <code>import ChildComponent from './ChildComponent';</code>. These two files ChildComponent and ParentComponent are in the same directory.</p></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="some-changes">Some Changes:<a href="https://letspretend.netlify.app/blog/passing-data-around-in-reactJs#some-changes" class="hash-link" aria-label="Direct link to Some Changes:" title="Direct link to Some Changes:">​</a></h4>
<p>To demonstrate how passing data works I will edit my Parent and Child components so please bare(🐻) with me 🙂. This how both files will change:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//ChildComponent.js</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token imports punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token imports"> </span><span class="token imports punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token imports"> useState </span><span class="token imports punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"react"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:hsl(221, 87%, 60%)">ChildComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">props</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token plain">value</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> setValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">useState</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">""</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token plain">displayValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> setDisplayValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">useState</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">""</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">handleChange</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">event</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">setValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">target</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">value</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">handleSubmit</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">event</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    event</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">preventDefault</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">setDisplayValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">value</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">setValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">""</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">h3</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">The</span><span class="token plain"> </span><span class="token maybe-class-name">User</span><span class="token plain"> </span><span class="token maybe-class-name">Inputted</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">displayValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">h3</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">form onSubmit</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">handleSubmit</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">label</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token maybe-class-name">Insert</span><span class="token plain"> </span><span class="token maybe-class-name">Data</span><span class="token plain"> </span><span class="token maybe-class-name">Here</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">input type</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token string" style="color:hsl(119, 34%, 47%)">"text"</span><span class="token plain"> onChange</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">handleChange</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> value</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">value</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">label</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">input type</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token string" style="color:hsl(119, 34%, 47%)">"submit"</span><span class="token plain"> value</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Submit"</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">form</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">export</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">default</span><span class="token plain"> </span><span class="token maybe-class-name">ChildComponent</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//ParentComponent.js</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"react"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">ChildComponent</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"./ChildComponent"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:hsl(221, 87%, 60%)">ParentComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">h1</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">Parent</span><span class="token plain"> </span><span class="token maybe-class-name">Component</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">h1</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">ChildComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">export</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">default</span><span class="token plain"> </span><span class="token maybe-class-name">ParentComponent</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>The Result:<br>
<img decoding="async" loading="lazy" alt="child-form" src="https://letspretend.netlify.app/assets/images/child-form-f3420bd319ae45dd2f21b979f3127443.PNG" width="560" height="313" class="img_ev3q"></p>
<p>The above just displays whatever a users inputs and if you check my child component now has a <code>props</code> argument. Why? Well let's talk about props a little.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ohh-wow-props">Ohh wow Props!<a href="https://letspretend.netlify.app/blog/passing-data-around-in-reactJs#ohh-wow-props" class="hash-link" aria-label="Direct link to Ohh wow Props!" title="Direct link to Ohh wow Props!">​</a></h3>
<p>So far I just touched base on some ReactJs functionalities and didn't talk about moving data around. Props will help us move data from parent-to-child and child-to-parent (in a slick way!).</p>
<p><code>Props</code> is short for properties and this argument can get data from the parent component and pass it down to the child component, let's see how.</p>
<p>If in my ParentComponent file I do something like:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//define const in ParentComponent function/component</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> message </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">'I come from parent'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//create custom property called parentMsg</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//this custom property can have any name.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">ChildComponent</span><span class="token plain"> parentMsg</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">message</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><br></span></code></pre></div></div>
<p>To get this piece of data in the child I will call <code>props.parentMsg</code> from inside the child component. Like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">h5</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">Message</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token literal-property property" style="color:hsl(5, 74%, 59%)">parent</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">props</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">parentMsg</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">h5</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><br></span></code></pre></div></div>
<p>This will result into something like:<br>
<img decoding="async" loading="lazy" alt="message-from-parent" src="https://letspretend.netlify.app/assets/images/message-from-parent-5f501f70dbfa5c7248ac12ac5314ec71.PNG" width="693" height="369" class="img_ev3q"></p>
<p>As we can see props allow the parent component to pass <code>data down to the child</code> but how does the child give data to the parent component? Well, props and pointers. Let's look at how that is done.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="event-props">Event Props<a href="https://letspretend.netlify.app/blog/passing-data-around-in-reactJs#event-props" class="hash-link" aria-label="Direct link to Event Props" title="Direct link to Event Props">​</a></h3>
<p>Event props are used to get data from a child component and then pass the data to the parent component. You essentially pass a pointer to a function defined in the parent component via props to a child component.</p>
<p>This function will get executed in the parent component when called in child component and it can have data from the child component. Okay! That sounded like something from a movie, let us slow down and look at what I mean by all this. 🙂</p>
<p>One example of this would be the <code>onChange</code> event handler. For a minute let's think of the custom html input tag as a ReactJs component then look closely at this piece of code from the ChildComponent.js file:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">input type</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token string" style="color:hsl(119, 34%, 47%)">"text"</span><span class="token plain"> onChange</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">handleChange</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> value</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">value</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><br></span></code></pre></div></div>
<p>we also added handleChange function in the child component that recieves an <code>event</code> argument:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">handleChange</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">event</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token function" style="color:hsl(221, 87%, 60%)">setValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">target</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">value</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Whenever we click on a button, input or other html elements an onClick/onChange event happens.
Whenever this happens in ReactJs, reacts brings back an event object that we can use.</p><p>More on events <a href="https://www.w3schools.com/js/js_events.asp" target="_blank" rel="noopener noreferrer">here</a>. This is just a Javascript conecpt extended in ReactJs. Events are not a ReactJs feature.</p></div></div>
<p>We then use that event object to get the data from the input "component". What we did here was to a pass function pointer of <code>handleChange</code> as a <code>onChange</code> prop to the input "component" then whenever a new value is inserted (onChnage event happens) in the input box the handleChange function from the parent component will be called with event object from the child component (input component). It pushed up (passed data) the event object to the component that uses it, in this instance the ChildComponent.js then the ChildComponent.js displayed the value.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>A pointer is just a reference to a function. What we are actually saying here is that whenever an onChange happens the input component should use the function handleChange to "react" to the change. The code that will run will be from the ChildComponent.js.</p></div></div>
<p>That was a little too much, I am sure an example can do now. Let's see how we can do this with our custom components.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ohh-wait-our-very-own-event-prop">Ohh Wait, Our Very Own Event Prop!<a href="https://letspretend.netlify.app/blog/passing-data-around-in-reactJs#ohh-wait-our-very-own-event-prop" class="hash-link" aria-label="Direct link to Ohh Wait, Our Very Own Event Prop!" title="Direct link to Ohh Wait, Our Very Own Event Prop!">​</a></h3>
<p>I will have to edit my components such that we have an unordered list rendered in the Parentcomponent.js file. Our ChildComponent.js will still have a form with one submit button.  Whenever we submit some text that text will be rendered in the ParentComponent.js. Intially our list has two messages/text/strings</p>
<p>This example will help see how the child can pass data to the parent component</p>
<p>Parent Component</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword module" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token imports punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token imports"> </span><span class="token imports punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token imports"> useState </span><span class="token imports punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"react"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">ChildComponent</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"./ChildComponent"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:hsl(221, 87%, 60%)">ParentComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token plain">listOfMessage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> setListOfMessage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">useState</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token string" style="color:hsl(119, 34%, 47%)">"First Message"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token string" style="color:hsl(119, 34%, 47%)">"Second Message"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">h1</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token maybe-class-name">Parent</span><span class="token plain"> </span><span class="token maybe-class-name">Component</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">h1</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">ChildComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">ul</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">listOfMessage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">map</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">message</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"> index</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">li key</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">index</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">p</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">message</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">p</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">li</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">ul</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">export</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">default</span><span class="token plain"> </span><span class="token maybe-class-name">ParentComponent</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>The child component:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword module" style="color:hsl(301, 63%, 40%)">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token imports punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token imports"> </span><span class="token imports punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token imports"> useState </span><span class="token imports punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">from</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"react"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:hsl(221, 87%, 60%)">ChildComponent</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">props</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token plain">value</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> setValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">useState</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">""</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">handleChange</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">event</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">setValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">target</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">value</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">form onSubmit</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">handleSubmit</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">label</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token maybe-class-name">Insert</span><span class="token plain"> </span><span class="token maybe-class-name">Data</span><span class="token plain"> </span><span class="token maybe-class-name">Here</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">input type</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token string" style="color:hsl(119, 34%, 47%)">"text"</span><span class="token plain"> onChange</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">handleChange</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> value</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">value</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">label</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">input type</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token string" style="color:hsl(119, 34%, 47%)">"submit"</span><span class="token plain"> value</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Submit"</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token plain">form</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">export</span><span class="token plain"> </span><span class="token keyword module" style="color:hsl(301, 63%, 40%)">default</span><span class="token plain"> </span><span class="token maybe-class-name">ChildComponent</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>useReact() function is a React hook for creating state variables. Hooks help provide react capabilities to function components (capabilities you would otherwise find in class components). Please visit <a href="https://reactjs.org/docs/hooks-state.html" target="_blank" rel="noopener noreferrer">ReactJs hooks</a> for more.</p><p>whenever state variables change react renders the view with the new data, no reload needed!</p></div></div>
<p>That will result to this:<br>
<img decoding="async" loading="lazy" alt="form-list" src="https://letspretend.netlify.app/assets/images/form-list-2d6fdfa13bad4bab3504d50bfeba8ded.PNG" width="648" height="351" class="img_ev3q"></p>
<p>So to make this a little interesting let's try add a new message when we submit a form (i.e move data from Child to Parent).</p>
<p>First we are going to create a handler/listner/event prop. This is the function we are going to define in the Parent component then pass the pointer to the child. Let's the following in the ParentComponent.js:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">handleMessageAdd</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">message</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//undate list with message from child</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">setListOfMessage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">prevListOfMessages</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token spread operator" style="color:hsl(221, 87%, 60%)">...</span><span class="token plain">prevListOfMessages</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> message</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//in return function</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//pass pointer to handleMessageAdd no "()"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">ChildComponent</span><span class="token plain"> onAddMessage</span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain">handleMessageAdd</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token operator" style="color:hsl(221, 87%, 60%)">/</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><br></span></code></pre></div></div>
<p>What this does is to add a message to our <code>listOfMessages</code> state variable. Then React will re-render our UI since <code>listOfMessages</code> is a state variables. We then pass the pointer to <code>handleMessageAdd</code> as prop to the child component.</p>
<p>In the child component let's add this bit of code:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">handleSubmit</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">event</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    event</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">preventDefault</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//function will be triggered in parent component.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    props</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">onAddMessage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">value</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">setValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">''</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>Now when I submit my form we will call <code>handleMessageAdd</code> from the parent. This is possible because in the child we have a reference pointer <code>onAddMessage</code> passed as a prop. <strong>So technically we are calling a function in ParentComponent using the data from the ChildComponent</strong></p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The child component recieves a pointer and when we invoke this pointer in the child component like this: <code>props.onAddMessage(value)</code> we are just calling the parent function we passed in the prop with data from the child component.</p></div></div>
<p>This way the parent component can be able to act on the data from the child. Here is the final product (not fancy looking but hopefully the point is clear):</p>
<p><img decoding="async" loading="lazy" alt="react-pass-data" src="https://letspretend.netlify.app/assets/images/react-pass-data-ea4945f2f7d5af0576b01e16edc7af58.gif" width="466" height="260" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://letspretend.netlify.app/blog/passing-data-around-in-reactJs#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h3>
<p>This has been a long one, but here is a quick summary of to passing data in ReactJs:</p>
<ul>
<li>To pass data from parent to child. Define custom property on the child component like: <code>&lt;ChildComponent customProp={data}&gt;</code></li>
<li>In the child component access the data from the props argument like: <code>props.customProp</code> this will give you whatever value <code>data</code> has.</li>
<li>To pass data from child to parent. Define custom property BUT pass a pointer to a function defined in the parent.</li>
<li>passing a pointer to a function as a prop allows us to use the child data in the parent component.</li>
</ul>
<p>Until next time, happy coding! 👋🚀</p>]]></content:encoded>
            <category>ReactJs</category>
            <category>FrontEnd</category>
            <category>Javascript</category>
        </item>
        <item>
            <title><![CDATA[CORS with .NET and React]]></title>
            <link>https://letspretend.netlify.app/blog/CORS with .NET and React</link>
            <guid>https://letspretend.netlify.app/blog/CORS with .NET and React</guid>
            <pubDate>Tue, 01 Mar 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Hello, Reader! 🙂, See what I did there? So I was trying to get into React and all that nice component driven front-end. Then I saw something like this when querying my API from React App:]]></description>
            <content:encoded><![CDATA[<p>Hello, Reader! 🙂, See what I did there? So I was trying to get into React and all that nice component driven front-end. Then I saw something like this when querying my API from React App:
<img decoding="async" loading="lazy" alt="cors-image" src="https://letspretend.netlify.app/assets/images/cors-example-a6278d7804134091358ad9bb7f6e01a3.jpg" width="1275" height="492" class="img_ev3q"></p>
<p>I haven't done a lot of FrontEnd work so this was terrifying but then I decided to visit the knowledge man, Google. I found out a lot about CORS and that inspired this blog post.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="topic">Topic:<a href="https://letspretend.netlify.app/blog/CORS%20with%20.NET%20and%20React#topic" class="hash-link" aria-label="Direct link to Topic:" title="Direct link to Topic:">​</a></h3>
<ul>
<li>What is CORS?</li>
<li>CORS policies</li>
<li>Understanding how Http is used in CORS.</li>
<li>How to Configure CORS in .NET Web APIs?</li>
<li>Conclusion</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-cors">What is CORS?<a href="https://letspretend.netlify.app/blog/CORS%20with%20.NET%20and%20React#what-is-cors" class="hash-link" aria-label="Direct link to What is CORS?" title="Direct link to What is CORS?">​</a></h3>
<p>CORS stands for Cross-Origin Resource Sharing. This refers to when we have one origin (domain) requesting resources (css files, json file, html pages, data, etc.) from another origin (domain). There are some restriction to how different origins share content and this is controlled via Http Headers.</p>
<p>So when I read this kind of explanation of CORs I was confused because I had my React app running on my local machine so was my .NET API, so what's up with that?</p>
<p>Well it turns out if we have our React code and .NET API running on the same domain (localhost) but having different port numbers, this is seen as two different origins that, here's a summary of origin equivalence:</p>
<ul>
<li><code>http://domain-a:portNumber1</code> vs <code>http://domain-a:portNumber2</code> - different origin (port is not the same number)</li>
<li><code>http://domain-a:portNumber1</code> vs <code>http://domain-b:portNumber1</code> - different origin (not the same machine/server)</li>
<li><code>https://domain-a:portNumber1</code> vs <code>http://domain-b:portNumber1</code> - different scheme (https and http) thus different origins.</li>
<li><code>http://domain-a:portNumber1/path/one</code> vs <code>http://domain-a:portNumber/path/two</code> - same origin.</li>
</ul>
<p>From above we can see for origins to be the same the port number, scheme and domain has to be the same. So this is the reason the browser thought my React app (running on <a href="http://localhost:3000/" target="_blank" rel="noopener noreferrer">http://localhost:3000</a>) was doing a Fetch request from a different origin (my API running on <a href="http://localhost:5000/" target="_blank" rel="noopener noreferrer">http://localhost:5000</a>).</p>
<p>Let's look at the CORS policies a little more. 🙂</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cors-policies">CORS policies<a href="https://letspretend.netlify.app/blog/CORS%20with%20.NET%20and%20React#cors-policies" class="hash-link" aria-label="Direct link to CORS policies" title="Direct link to CORS policies">​</a></h3>
<p>These are policies enforced by the data issuer. This can be the owner of the API. The Policy might be something like allowing all requests from any domain to get data or only allow one domain.</p>
<p>These policies are configured in different ways. In this post we will be looking at how .NET CORE does this.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The client app can be any kind of app: React, Angular, etc.<br>
<!-- -->The idea here is to show how the web api can be configure to issue data with some CORS policies.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="understanding-how-http-is-used-in-cors">Understanding how Http is used in CORS.<a href="https://letspretend.netlify.app/blog/CORS%20with%20.NET%20and%20React#understanding-how-http-is-used-in-cors" class="hash-link" aria-label="Direct link to Understanding how Http is used in CORS." title="Direct link to Understanding how Http is used in CORS.">​</a></h3>
<p>The browser uses http headers to enforce CORS policies. Suppose We have to two origins: <code>originA</code> and <code>originB</code>.</p>
<p>Think of <code>originA</code> as your ReactApp and <code>originB</code> as your Web API</p>
<p>originA tries to query data from originB, because this is a cross-origin request the browser will send a preflight to originB.</p>
<p>A Preflight is a http request to a server with headers of the request only. The browser does this to see if originA is allowed to query data from originB. If it is allowed then it gets data, if not then the browser will throw a CORS error.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If the cors header details of originA are the same as those of originB then A is allowed to query B.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-configure-cors-in-net-web-apis">How to Configure CORS in .NET Web APIs?<a href="https://letspretend.netlify.app/blog/CORS%20with%20.NET%20and%20React#how-to-configure-cors-in-net-web-apis" class="hash-link" aria-label="Direct link to How to Configure CORS in .NET Web APIs?" title="Direct link to How to Configure CORS in .NET Web APIs?">​</a></h3>
<p>.NET CORE provides a number of ways to configure CORS policies on your Web API. We are going to explore three of them here. These configuration are done in the <code>StartUp.cs</code> thus middleware pipeline. Brace yourself 🙃.</p>
<p>We are gonna discuss three ways .NET CORE makes it possible for us to configure CORS policies. Here is the list:</p>
<ul>
<li>Named Policy and Middleware</li>
<li>Endpoint specific CORS configuration</li>
<li>Using Attribute.</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="named-policy-and-middleware">Named Policy and Middleware<a href="https://letspretend.netlify.app/blog/CORS%20with%20.NET%20and%20React#named-policy-and-middleware" class="hash-link" aria-label="Direct link to Named Policy and Middleware" title="Direct link to Named Policy and Middleware">​</a></h4>
<p>The <code>StartUp.cs</code> has two important methods <code>ConfigureServices(IServiceCollection services)</code> and <code>Configure(IApplicationBuilder app, IWebHostEnvironment env)</code>.</p>
<ul>
<li>ConfigureServices : This method is responsible for creating services like injecting a service you are going to use in your application</li>
<li>Configure : This method registers services that your application will use. Creates a middleware pipeline</li>
</ul>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//In ConfigureServices() method</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">ConfigureServices</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter maybe-class-name">IServiceCollection</span><span class="token parameter"> services</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//left out some code for clarity</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//creating a new CORS policy with arbitrary name 'AllowDomain-A' </span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  services</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddCors</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">options</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    options</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddPolicy</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"AllowDomain-A"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token parameter">builder</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">WithOrigins</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"http://domain-a:3000"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AllowAnyHeader</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AllowAnyMethod</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//left out some code for clarity</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//In Configure() method</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">Configure</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter maybe-class-name">IApplicationBuilder</span><span class="token parameter"> app</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"> </span><span class="token parameter maybe-class-name">IWebHostEnvironment</span><span class="token parameter"> env</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">env</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">IsDevelopment</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseDeveloperExceptionPage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">else</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseExceptionHandler</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"/Error"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseHsts</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseRouting</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//usage of created CORS policy.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseCors</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"AllowDomain-A"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>This configuration will allow any request from http:domain-a:3000. In the builder above we specified that our CORS policy (<code>AllowOrigin-A</code>) can allow any Header and Http Method that domain-a will send as part of the Http Request to this Web API.</p>
<p>The <code>app.UseCors()</code> must be before <code>app.UseRouting()</code>. Please refer to Caution note below for more info.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p><strong>app.UseHttpsRedirection()</strong> can make your cors behave weirdly since it redirects http to https and this can potentially restrict a correct request. Better not have this and just throw an exception for an http request that is not secure or specify use the middleware to be used in non-prod environments using the env.IsDevelopment condition check.</p></div></div>
<div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_BuS1"><p>The order in which you register your services in Configure method is important. Please checkout <a href="https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-6.0#middleware-order" target="_blank" rel="noopener noreferrer">this</a> guide for more.</p></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="endpoint-specific-cors-configuration">Endpoint specific CORS configuration<a href="https://letspretend.netlify.app/blog/CORS%20with%20.NET%20and%20React#endpoint-specific-cors-configuration" class="hash-link" aria-label="Direct link to Endpoint specific CORS configuration" title="Direct link to Endpoint specific CORS configuration">​</a></h4>
<p>This configuration is endpoint specific unlike the first one which was global to the application. This is good if you have want to have different data controls for different endpoints in your API.</p>
<p>The setup is similar we create a policy then use it in Configure method</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//In ConfigureServices() method</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">ConfigureServices</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter maybe-class-name">IServiceCollection</span><span class="token parameter"> services</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//left out some code for clarity</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//creating a new CORS policy with arbitrary name 'AllowDomain-A' </span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  services</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddCors</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">options</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    options</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddPolicy</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"AllowDomain-A"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token parameter">builder</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">WithOrigins</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"http://domain-a:3000"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AllowAnyHeader</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AllowAnyMethod</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//left out some code for clarity</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//In Configure() method</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">Configure</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter maybe-class-name">IApplicationBuilder</span><span class="token parameter"> app</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"> </span><span class="token parameter maybe-class-name">IWebHostEnvironment</span><span class="token parameter"> env</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">env</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">IsDevelopment</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseDeveloperExceptionPage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">else</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseExceptionHandler</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"/Error"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseHsts</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseRouting</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//enables CORS middleware</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseCors</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//specify which cors policy to enforce on this specific endpoint.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseEndpoints</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">endpoints</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      endpoints</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">MapControllerRoute</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token literal-property property" style="color:hsl(5, 74%, 59%)">name</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"default"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token literal-property property" style="color:hsl(5, 74%, 59%)">pattern</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"{controller}/{action=Index}/{id?}"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">RequiresCors</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"AllowDomain-A"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>Notice that we still use <code>app.UseCors()</code> that's because we need to enable our cors policy in middleware pipeline then we use it later in <code>app.UseEndpoints()</code>.</p>
<p>This means the endpoint satisfying this pattern will enforce the <code>AllowDomain-A</code> policy.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="using-attribute">Using Attribute.<a href="https://letspretend.netlify.app/blog/CORS%20with%20.NET%20and%20React#using-attribute" class="hash-link" aria-label="Direct link to Using Attribute." title="Direct link to Using Attribute.">​</a></h4>
<p>The other way would be using the cors attribute. Which is also more specific. More readable too. The other advantage would be that we can have multiple policies for different action methods in one controller.</p>
<p>The set up is similar we create the policy in ConfigureServices() then call the app.UseCors() in Configure method.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">ConfigureServices</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter maybe-class-name">IServiceCollection</span><span class="token parameter"> services</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//left out some code for clarity</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//creating a new CORS policy with arbitrary name 'AllowDomain-A' </span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  services</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddCors</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">options</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    options</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddPolicy</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"AllowDomain-A"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token parameter">builder</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">WithOrigins</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"http://domain-a:3000"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AllowAnyHeader</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AllowAnyMethod</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  services</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddCors</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">options</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    options</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AddPolicy</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"AllowDomain-B"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token parameter">builder</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">WithOrigins</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"http://domain-b:3000"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AllowAnyHeader</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      builder</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">AllowAnyMethod</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//left out some code for clarity</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//In Configure() method</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">Configure</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter maybe-class-name">IApplicationBuilder</span><span class="token parameter"> app</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"> </span><span class="token parameter maybe-class-name">IWebHostEnvironment</span><span class="token parameter"> env</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">env</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">IsDevelopment</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseDeveloperExceptionPage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">else</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseExceptionHandler</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"/Error"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">      app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseHsts</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseRouting</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//enables CORS middleware</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  app</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">UseCors</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>We now have two policies and we can then have a controller with these action methods:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//Inside some controller</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">EnableCors</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"AllowDomain-A"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token maybe-class-name">IAction</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">GetDataForA</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//gets data for domain-a</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">EnableCors</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"AllowDomain-B"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token maybe-class-name">IAction</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">GetDataForB</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//gets data for domain-b</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>This will make sure that each action method has it's own CORS policy to enforce, isn't that just great! 😎.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://letspretend.netlify.app/blog/CORS%20with%20.NET%20and%20React#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h3>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>CORS is a control feature not a security feature. It doesn't secure your data it just gives you control on how to issue it and who you choose should see it.</p></div></div>
<p>This has been a long one! So here's a little summary:</p>
<ul>
<li>CORS is cross-origin resource sharing (server doing http request to another server).</li>
<li>CORS allows you to control which domain sees your data.</li>
<li>.NET Core has a handful of features to allow you to configure these policies for your API.</li>
</ul>
<p>This blog has little insight compared to this <a href="https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-6.0" target="_blank" rel="noopener noreferrer">Microsoft guide</a>, please check it out for more insight.</p>
<p>Until next time, bye. 👋</p>]]></content:encoded>
            <category>React</category>
            <category>FrontEnd</category>
            <category>CORS</category>
            <category>.NET</category>
        </item>
        <item>
            <title><![CDATA[Mocking HttpClient]]></title>
            <link>https://letspretend.netlify.app/blog/HttpClient Message Handler</link>
            <guid>https://letspretend.netlify.app/blog/HttpClient Message Handler</guid>
            <pubDate>Tue, 01 Feb 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Hello again. I recently had a task to unit test a service I wrote. I was using .NET's HttpClient to do calls to an API I was consuming, all was good until I had unit test my work.]]></description>
            <content:encoded><![CDATA[<p>Hello again. I recently had a task to unit test a service I wrote. I was using .NET's HttpClient to do calls to an API I was consuming, all was good until I had unit test my work.</p>
<p>In this blog post I am going to explore how to "mock" HttpClient with FakeItEasy. The interesting thing here is that FakeItEasy unit can only mock Interfaced objects but as we know .NET's HttpClient doesn't extend an interface. So how do we start?</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="topics">Topics:<a href="https://letspretend.netlify.app/blog/HttpClient%20Message%20Handler#topics" class="hash-link" aria-label="Direct link to Topics:" title="Direct link to Topics:">​</a></h2>
<ul>
<li>What is Mocking?</li>
<li>Why FakeItEasy can't mock HttpClient.</li>
<li>Structure of HttpClient.</li>
<li>Mocking HttpClient.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-mocking">What is Mocking?<a href="https://letspretend.netlify.app/blog/HttpClient%20Message%20Handler#what-is-mocking" class="hash-link" aria-label="Direct link to What is Mocking?" title="Direct link to What is Mocking?">​</a></h3>
<p>The term mock is used in software development to say "I am creating a fake object". This is important when doing tests because this means we can configure our object to act the way we want thus making it possible to make our test cases give expected output.</p>
<p>Here is an example:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//Test Case</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token maybe-class-name">Fact</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">Calling_Service_With_Valid_Input</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//IDataService is an interface that DataService implements. </span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token maybe-class-name">DataService</span><span class="token plain"> dataService </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token constant" style="color:hsl(35, 99%, 36%)">A</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Fake</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">IDataService</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//tells FakeItEasy to return an object specified in Returns() despite any string passed.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token constant" style="color:hsl(35, 99%, 36%)">A</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">CallTo</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> dataService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">GetData</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token constant" style="color:hsl(35, 99%, 36%)">A</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">string</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Ignored</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Returns</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Data</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:hsl(5, 74%, 59%)">dataValue</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"value"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//using fake service which won't make a real call</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> homeController </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">HomeController</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">dataService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//calling the method we are testing.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> result </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> homeController</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">GetAllData</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Test string"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//expect that the returned data value returns the Data object we created</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token maybe-class-name">Assert</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Equals</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"value"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> result</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">dataValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>In The above example we use the <code>HomeController</code> class that uses the IDataService to get some data via the GetAllData() method.</p>
<p>The test case above just wants to check if I put a valid string input I get back data. I don't really want make a real call to the API that is called by GetData.</p>
<p>So What I do is to "mock" the behavior I want, that is mock the service going to query data for my valid string. Suppose in our service we have a check that says: <code>if input is null or empty throw an exception</code>.</p>
<p>In the above we wanted to see if we didn't put a null or empty string will we get the expected output without worrying about actually calling the service for real data.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-fakeiteasy-cant-mock-httpclient">Why FakeItEasy can't mock HttpClient.<a href="https://letspretend.netlify.app/blog/HttpClient%20Message%20Handler#why-fakeiteasy-cant-mock-httpclient" class="hash-link" aria-label="Direct link to Why FakeItEasy can't mock HttpClient." title="Direct link to Why FakeItEasy can't mock HttpClient.">​</a></h3>
<p>FakeItEasy can only fake anything that can be overridden, extended or implemented. Mostly you will find yourself mock interfaces and bending the behavior of an interface's implementation to suit your test cases.</p>
<p>Check out this <a href="https://fakeiteasy.readthedocs.io/en/stable/what-can-be-faked/" target="_blank" rel="noopener noreferrer">link</a> for more info.</p>
<p>HttpClient doesn't implement an interface this causes issues when trying to use FakeItEasy. In the next section we will learn a quick overview of the HttpClient class that will enable us to "mock" this object.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="structure-of-httpclient">Structure of HttpClient<a href="https://letspretend.netlify.app/blog/HttpClient%20Message%20Handler#structure-of-httpclient" class="hash-link" aria-label="Direct link to Structure of HttpClient" title="Direct link to Structure of HttpClient">​</a></h3>
<p>From the above section we have learned that HttpClient doesn't implement as interface thus FakeItEasy can't mock it.</p>
<p>But if we look into the <code>HttpClient.cs</code> class we will see a constructor like this: <code>public HttpClient(HttpMessageHandler handler);</code> and digging deeper you will see that <a href="https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpmessagehandler" target="_blank" rel="noopener noreferrer">HttpMessageHandler</a> is an abstract class.</p>
<p>But what is this handler and what does it do, why is it important to us?</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="a-word-on-httpmessagehandler">A word on HttpMessageHandler<a href="https://letspretend.netlify.app/blog/HttpClient%20Message%20Handler#a-word-on-httpmessagehandler" class="hash-link" aria-label="Direct link to A word on HttpMessageHandler" title="Direct link to A word on HttpMessageHandler">​</a></h5>
<p>The short explanation would be, the handler receives requests and create http response via as the <code>HttpMessageResponse</code> object. It brings back the response via an abstract method called <a href="https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpmessagehandler.sendasync" target="_blank" rel="noopener noreferrer">SendAsync</a> that we can override.</p>
<p>This essentially means we can create our own handler that implements HttpMessageHandler thus override <code>SendAsync</code> with our implementation and since it is the one doing all the request processing and gives back a response this means we can just configure it to give us a desired result. 🙂</p>
<p>I have left a lot of detail in this breakdown but this will be enough to help us mock HttpClient.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="mocking-httpclient">Mocking HttpClient.<a href="https://letspretend.netlify.app/blog/HttpClient%20Message%20Handler#mocking-httpclient" class="hash-link" aria-label="Direct link to Mocking HttpClient." title="Direct link to Mocking HttpClient.">​</a></h3>
<p>Suppose we have a classes <code>DataService</code> that implements an interface called <code>IDataService</code>:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//*******IDataService interface</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">interface</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">IDataService</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token maybe-class-name">Data</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">GetDataFromAPI</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">string query</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//******DataService class</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">DataService</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token maybe-class-name">IDataService</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//injected via DI</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">private</span><span class="token plain"> readonly </span><span class="token maybe-class-name">HttpClient</span><span class="token plain"> _httpClient</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">DataService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter maybe-class-name">HttpClient</span><span class="token parameter"> httpClient</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        _httpClient </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> httpClient</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//Assuming Data is a model created in our project.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">async</span><span class="token plain"> </span><span class="token maybe-class-name">Data</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">GetDataFromAPI</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter">string query</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        httpClient</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">BaseAddress</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Uri</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">$</span><span class="token string" style="color:hsl(119, 34%, 47%)">"http://random.api.data/"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> response </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">await</span><span class="token plain"> httpClient</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">GetAsync</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"data/getAll"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">response</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">IsSuccessStatusCode</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> contentStream </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">await</span><span class="token plain"> response</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Content</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">ReadAsStreamAsync</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">await</span><span class="token plain"> </span><span class="token maybe-class-name">JsonSerializer</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Deserializer</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">Data</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">contentStream</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token keyword null nil" style="color:hsl(301, 63%, 40%)">null</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p><strong>Note:</strong> Methods like <code>GetAsync</code> and <code>PostAsync</code> use SendAsync underneath. So if we configure SendAsync we can still get desired results.</p>
<p>Let's say we have a unit test for when we get back data . For simplicity's sake we won't do a detailed test, we just want to see how to "mock" HttpClient.</p>
<p>As discussed we will need to mock the HttpMessageHandler. Let's see how.</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="creating-fake-httpmessagehandler">Creating fake HttpMessageHandler.<a href="https://letspretend.netlify.app/blog/HttpClient%20Message%20Handler#creating-fake-httpmessagehandler" class="hash-link" aria-label="Direct link to Creating fake HttpMessageHandler." title="Direct link to Creating fake HttpMessageHandler.">​</a></h5>
<p>Remember <code>HttpMessageHandler</code> is an abstract class so we can implement our handler and make it behave how we want.</p>
<p>Consider the following class:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">FakeHttpMessageHandler</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token maybe-class-name">HttpMessageHandler</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    internal </span><span class="token maybe-class-name">Func</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">HttpResponseMessage</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> _sendAsync </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword null nil" style="color:hsl(301, 63%, 40%)">null</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">protected</span><span class="token plain"> override </span><span class="token maybe-class-name">Task</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">HttpResponseMessage</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">SendAsync</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">_sendAsync </span><span class="token operator" style="color:hsl(221, 87%, 60%)">==</span><span class="token plain"> </span><span class="token keyword null nil" style="color:hsl(301, 63%, 40%)">null</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">throw</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">NotImplementedException</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"sendAsync not implemented"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token maybe-class-name">Task</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">FromResult</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token function" style="color:hsl(221, 87%, 60%)">_sendAsync</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>Here we have overridden SendAsync and made our implementation. In this fake handler we have a _sendAsync property which is a delegate function. This just means we can create a method that returns HttpResponseMessage from wherever we are using <code>HttpResponseMessage</code> and then assign it to _sendAsync.</p>
<p>This means we can then have any kind of implementation of _sendAsync we want then return it inside of <code>SendAsync()</code> (The Handler's method responsible for sending and receiving responses).</p>
<p>The other way would be to create a constructor for the <code>FakeHttpMessageHandler</code> class then pass the HttpResponseMessage that you would like <code>SendAsync()</code> to return, like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">FakeHttpMessageHandler</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token maybe-class-name">HttpMessageHandler</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">private</span><span class="token plain"> </span><span class="token maybe-class-name">HttpResponseMessage</span><span class="token plain"> _httpResponseMessage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">FakeHttpMessageHandler</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter maybe-class-name">HttpResponseMessage</span><span class="token parameter"> response</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        _httpResponseMessage </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> response</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">protected</span><span class="token plain"> override </span><span class="token maybe-class-name">Task</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">HttpResponseMessage</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">SendAsync</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">_httpResponseMessage </span><span class="token operator" style="color:hsl(221, 87%, 60%)">==</span><span class="token plain"> </span><span class="token keyword null nil" style="color:hsl(301, 63%, 40%)">null</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">throw</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">ArgumentException</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"Please provide valid HttpResponseMessage"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token maybe-class-name">Task</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">FromResult</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">_httpResponseMessage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>Both approaches achieve the same end goal: fake a handler so that httpClient can use it to mimic an Http request call.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="using-the-fakehttpmessagehandler">Using The FakeHttpMessageHandler.<a href="https://letspretend.netlify.app/blog/HttpClient%20Message%20Handler#using-the-fakehttpmessagehandler" class="hash-link" aria-label="Direct link to Using The FakeHttpMessageHandler." title="Direct link to Using The FakeHttpMessageHandler.">​</a></h4>
<p>Let's see how we can use the FakeHttpMessageHandler. First with the Func approach:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token maybe-class-name">Fact</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">async</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">Calling_Services_Returns_Data</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token maybe-class-name">Data</span><span class="token plain"> fakeData </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Data</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token literal-property property" style="color:hsl(5, 74%, 59%)">dataValue</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"fakeValue"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> fakeHandler </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">FakeHttpMessageHandler</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token function-variable function" style="color:hsl(221, 87%, 60%)">_sendAsync</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:hsl(221, 87%, 60%)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">HttpResponseMessage</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//using Newtonsoft.Json to serialize object</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token maybe-class-name">StatusCode</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token maybe-class-name">System</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Net</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Http</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">StatusCode</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token constant" style="color:hsl(35, 99%, 36%)">OK</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">                </span><span class="token maybe-class-name">Content</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">StringContent</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">JsonConvert</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">SerializeObject</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">fakeData</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//This won't make real calls.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//The response will always be what we configured above.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> httpClient </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">HttpClient</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">fakeHandler</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> service </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">DataService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">httpClient</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//This should pass.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> result </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">await</span><span class="token plain"> service</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">GetDataFromAPI</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"some-query"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token maybe-class-name">Assert</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Equal</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"fakeValue"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> result</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">dataValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>If you chose the second implementation of the fake handler, this is how you would go about faking the call.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token maybe-class-name">Fact</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">async</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">Calling_Services_Returns_Data</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token maybe-class-name">Data</span><span class="token plain"> fakeData </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token literal-property property" style="color:hsl(5, 74%, 59%)">dataValue</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"fakeValue"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> responseMessage </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">HttpResponseMessage</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//using Newtonsoft.Json to serialize object</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token maybe-class-name">StatusCode</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token maybe-class-name">System</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Net</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">Http</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access maybe-class-name">StatusCode</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token constant" style="color:hsl(35, 99%, 36%)">OK</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token maybe-class-name">Content</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">StringContent</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token maybe-class-name">JsonConvert</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">SerializeObject</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">fakeData</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> fakeHandler </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">FakeHttpMessageHandler</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">responseMessage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//This won't make real calls.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//The response will always be what we configured above.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> httpClient </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">HttpClient</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">fakeHandler</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> service </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">DataService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">httpClient</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//This should pass.</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> result </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">await</span><span class="token plain"> service</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">GetDataFromAPI</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"some-query"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token maybe-class-name">Assert</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">Equal</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"fakeValue"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> result</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">dataValue</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>This should be enough to mock an HttpClient request for your unit test.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://letspretend.netlify.app/blog/HttpClient%20Message%20Handler#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<ul>
<li>FakeItEasy can't fake HttpClient because it doesn't extend an interface</li>
<li>HttpClient has a constructor that takes in HttpMessageHandler which is an abstract class.</li>
<li>The HttpMessageHandler handlers requests and responses done via HttpClient.</li>
<li>It has an abstract method call SendAsync which returns an http response object, HttpResponseMessage.</li>
<li>We can implement the handler and make SendAsync return any type of HttpResponseMessage we want.</li>
<li>This allows us to make fake http requests thus ease unit testing.</li>
</ul>
<p>This has been one long blog 😁, hopefully it wasn't boring. Thank you for reading and until next time. Bye! and Remember, pretend until you are not.</p>]]></content:encoded>
            <category>HttpClient</category>
            <category>.NET</category>
            <category>Xunit</category>
            <category>FakeItEasy</category>
            <category>Mocking</category>
        </item>
        <item>
            <title><![CDATA[Dependency Injection]]></title>
            <link>https://letspretend.netlify.app/blog/dependency-injection</link>
            <guid>https://letspretend.netlify.app/blog/dependency-injection</guid>
            <pubDate>Sat, 01 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[In this blog post we will pretend we know what Dependency Injection is, hang tight but not too tight, remember loose coupling!]]></description>
            <content:encoded><![CDATA[<p>In this blog post we will pretend we know what Dependency Injection is, hang tight but not too tight, remember loose coupling!</p>
<p>Most of the time when we write code we need some service to help us and typically we would use the <code>new</code> keyword to create an object to help us use that service. This can be helpful in the short term but it has downsides.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-a-dependency">What Is A Dependency?<a href="https://letspretend.netlify.app/blog/dependency-injection#what-is-a-dependency" class="hash-link" aria-label="Direct link to What Is A Dependency?" title="Direct link to What Is A Dependency?">​</a></h3>
<p>A dependency is creation of an object in another class, this is typically made using the <code>new</code> keyword. Say I have two classes <code>HomeScreen</code> and <code>PictureService</code> where we want to use the PictureService in the HomeScreen class. I can create a dependency in the HomeScreen class by doing something like:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> pictureService </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">PictureService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><br></span></code></pre></div></div>
<p>We then say HomeScreen has a dependency on PictureService, that is HomePage depends on some service(s) PictureService has for it to fulfill it's purpose. This works but there are problems with this approach.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="wait-what-is-coupling">Wait, What Is Coupling?<a href="https://letspretend.netlify.app/blog/dependency-injection#wait-what-is-coupling" class="hash-link" aria-label="Direct link to Wait, What Is Coupling?" title="Direct link to Wait, What Is Coupling?">​</a></h3>
<p>I bet you once heard something like "loose coupling, tight cohesion" from someone in the software dev community. Well what exactly does this mean?</p>
<p>Suppose you have two classes <code>ClassA</code> and <code>ClassB</code> such that ClassB has dependency on ClassA (i.e we have a call like <code>var classA = new ClassA()</code> in ClassB). Coupling would refer to relationship between ClassA and ClassB. If I can change the implementation of ClassA without really affecting the implementation of ClassB, then we have a <code>loose coupling</code> relationship.</p>
<p>The opposite is true, if making changes to ClassA affects the implementation of ClassB then we have tight coupling. This is where the idea of Inversion Of Control <a href="https://stackoverflow.com/questions/3058/what-is-inversion-of-control#:~:text=The%20Inversion%2Dof,from%20your%20code." target="_blank" rel="noopener noreferrer">IoC</a> comes from. This means ClassB doesn't really need to know about the implementation of ClassA all it should be concerned about is what ClassA has to return to it.</p>
<p>I spoke about cohesion, this just means that a class has a clear objective. If I have a class called <code>Person</code> and it has the following methods:</p>
<ul>
<li>getEmail()</li>
<li>validateEmail()</li>
<li>validatePersonPassword()</li>
</ul>
<p>This would be regarded as loose cohesion (The class does way more than it's supposed to), meaning a Person is better with methods and properties that relate to a person object like:</p>
<ul>
<li>getName()</li>
<li>setAge()</li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If changing one class affects other class' implementation then <code>tight coupling</code>
If a class doesn't have a clear objective or task <code>loose cohesion</code>. We want: loose coupling and tight cohesion.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="now-dependency-injection">Now, Dependency Injection<a href="https://letspretend.netlify.app/blog/dependency-injection#now-dependency-injection" class="hash-link" aria-label="Direct link to Now, Dependency Injection" title="Direct link to Now, Dependency Injection">​</a></h3>
<p>Okay we have rambled on about some big words like <code>cohesion</code> and <code>coupling</code> now let's look at DI.</p>
<h6 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-a-dependency-injection">What is a dependency injection?<a href="https://letspretend.netlify.app/blog/dependency-injection#what-is-a-dependency-injection" class="hash-link" aria-label="Direct link to What is a dependency injection?" title="Direct link to What is a dependency injection?">​</a></h6>
<p>DI is when one object/method supplies a dependency to another class.
Instead of ClassB creating an object of ClassA by the <code>new</code> keyword we call method/object to do this.</p>
<h6 class="anchor anchorWithStickyNavbar_LWe7" id="why-is-this-beneficial">Why is this beneficial?<a href="https://letspretend.netlify.app/blog/dependency-injection#why-is-this-beneficial" class="hash-link" aria-label="Direct link to Why is this beneficial?" title="Direct link to Why is this beneficial?">​</a></h6>
<p>As we will see DI makes it easy for us to test other classes without worrying about services crippling our tests.
Most of the time when we run unit tests we want to configure our services to give us certain values and it's hard to do that if we defined our service in different places.</p>
<p>DI enforces <code>single responsibility</code> principle as you will see injecting services makes it easy for your class to do what it must do.
Thus it doesn't have to worry about configuring services.</p>
<p>It can be hard make a service give mock data if you can't mock it (or straight up impossible).
This typically happens when we have our service instantiated in a method we are testing.</p>
<p>DI allows us to configure our service in one place and reuse the same object all over our class.</p>
<p>Suppose we have two classes <code>HomeScreen</code> and <code>PictureService</code>:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//HomePage</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">HomePage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//constructor</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//called to render views to the screen</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">RenderView</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token function" style="color:hsl(221, 87%, 60%)">getHomePagePictures</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//get pictures and sets the appropriately</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">private</span><span class="token plain"> </span><span class="token maybe-class-name">List</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">Pictures</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">getHomePagePictures</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token maybe-class-name">IFormatter</span><span class="token plain"> pngFormatter </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">PngFormatter</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"good quality"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> pictureService </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">PictureService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">pngFormatter</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> pictureService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">getPictures</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//PictureService</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">PictureService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter maybe-class-name">IPictureFormatter</span><span class="token parameter"> formatter</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//do some formatting</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//some code here</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//returns pictures from database</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token maybe-class-name">List</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">Pictures</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">getPictures</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> database </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">DatabaseService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"select * from Images"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> database</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">ToList</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>If I want to test the <code>RenderView()</code> method in the HomePage class I have no way of configuring my IFormatter implementation and my PictureService so they can give me expected output.
Maybe I can try something like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//HomePage</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">HomePage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//constructor</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//made services globals</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token maybe-class-name">IFormatter</span><span class="token plain"> pngFormatter </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">pngFormatter</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"good quality"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> pictureService </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">PictureService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">pngFormatter</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//called to render views to the screen</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> string </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">RenderView</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> pictures </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">getHomePagePictures</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">if</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">pictures</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">quality</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">==</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"bad quality"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"bad quality"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"good quality"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//get pictures and sets the appropriately</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">private</span><span class="token plain"> </span><span class="token maybe-class-name">List</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">Pictures</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">getHomePagePictures</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> pictureService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">getPictures</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>Now I have my services global variables instantiated once.
This again poses the same problem, If I were to test this class I wouldn't be able to configure my services (<code>IFormatter</code> and <code>PictureService</code>).
This makes unit testing the HomePage method a nightmare.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="constructor-dependency-injection">Constructor Dependency Injection<a href="https://letspretend.netlify.app/blog/dependency-injection#constructor-dependency-injection" class="hash-link" aria-label="Direct link to Constructor Dependency Injection" title="Direct link to Constructor Dependency Injection">​</a></h4>
<p>This lead us to <code>constructor dependency injection</code> which is injecting the dependency via a constructor:
Consider the following example:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//HomePage</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">HomePage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token parameter maybe-class-name">IFormatter</span><span class="token parameter"> formatter</span><span class="token parameter punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token parameter"> </span><span class="token parameter maybe-class-name">PictureService</span><span class="token parameter"> pictureService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  _pngFormatter </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> formatter</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  _pictureService </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> pictureService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//called to render views to the screen</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:hsl(221, 87%, 60%)">RenderView</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token function" style="color:hsl(221, 87%, 60%)">getHomePagePictures</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">//get pictures and sets the appropriately</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">private</span><span class="token plain"> </span><span class="token maybe-class-name">List</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">Pictures</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">getHomePagePictures</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> pictureService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">getPictures</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>Now the class that will use HomePage object has total control of the "type" of services it passes and HomePage doesn't have to worry about configuring services.
This is a small change but it has taken the responsibility of configuring services from HomePage and it can focus on its responsibility.</p>
<p>If we have a test class we can now do something like:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">//Test class</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">makeHomePageReturnBadQualityImages</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token maybe-class-name">IFormatter</span><span class="token plain"> fakeFormatter </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token maybe-class-name">Mock</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token plain">pngFormatter</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">make</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">it</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token keyword control-flow" style="color:hsl(301, 63%, 40%)">return</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token string" style="color:hsl(119, 34%, 47%)">"bad quality"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> pictureService </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token maybe-class-name">Mock</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&lt;</span><span class="token maybe-class-name">PictureService</span><span class="token operator" style="color:hsl(221, 87%, 60%)">&gt;</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token property-access">with</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">constructor</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">fakeFormatter</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">var</span><span class="token plain"> homePage </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">new</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">HomePage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">fakeFormatter</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> pictureService</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token comment" style="color:hsl(230, 4%, 64%)">//action</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token maybe-class-name">Assert</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access" style="color:hsl(221, 87%, 60%)">equal</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">homePage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">.</span><span class="token method function property-access maybe-class-name" style="color:hsl(221, 87%, 60%)">RenderView</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(119, 34%, 47%)">"bad quality"</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></span></code></pre></div></div>
<p>See the test class has total control of the kind of implementation of the services, ideally we would also pass the PictureService as an interface but that's for another day :).</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://letspretend.netlify.app/blog/dependency-injection#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h3>
<p>DI helps us by enforcing the single responsibility principle thus IoC.
I hope this helps you see the benefit of DI or at least lets you see what it is all about.</p>
<p>Stay tuned for more. Remember keep pretending until you are not, Bye!</p>]]></content:encoded>
            <category>IoC</category>
            <category>loose-coupling</category>
            <category>DI</category>
            <category>OOP</category>
        </item>
    </channel>
</rss>