This repository was archived by the owner on Dec 12, 2022. It is now read-only.

Repository files navigation

EntityDb.NET Codacy BadgeCodacy BadgeBuild

At its core, EntityDb.NET is a set of abstractions and implementations for the Event Sourcing pattern, with the added ability to enforce uniqueness constraints and the ability to tag resources.

What is Event Sourcing?

Event Sourcing centers around the idea that your source of truth is not the current state, it is all of the deltas that add up to the current state. Consider your personal bank - which of these options do you think it their source of truth for account balances?

  • Option A - Table Rows
    • John Doe has $123.45 in Account A
    • Jane Doe has $678.90 in Account B
  • Option B - Transactions
    • John Doe deposited $100.00 in Account A
    • Jane Doe deposited $600.00 in Account B
    • John Doe deposited $20.00 in Account A
    • Jane Doe deposited $70.00 in Account B
    • John Doe deposited $3.45 in Account A
    • Jane Doe deposited $8.90 in Account B

The answer is pretty obvious if you go check your bank statement. They keep a set of transactions, and regurgitate that information on the statement. (If I'm wrong, you should consider getting a new bank, ASAP!)

How does EntityDb.NET implement Event Sourcing?

There are several core objects at the heart of this implementation. Encalsulating these objects are various repositories.

  1. Transaction Repository
    • Agents
    • Commands
    • Tags
    • Leases
  2. Snapshot Repository
    • Snapshots
  3. Entity Repository
    • Transaction Repository
    • Optional: Snapshot Repository
  4. Projection Repository
    • Transaction Repository
    • Optional: Snapshot Repository

Transactions

A transaction represents an atomic operation on multiple entities. A transaction is committed atomically or not at all. If some step in the transaction fails, the entire transaction should fail.

Agents

An agent is an actor that can execute transactions. For example, if a transaction is initiated via an HTTP API, you might use the HttpContextAgent - it's signature includes headers and connection information, and it uses the ClaimsPrincipal to decide if an agent has a particular role required for authorized commands.

Commands

A command represents the intent to perform some operation on a single entity. Going back to the bank account example, one command could be PerformDeposit while another could be PerformWithdrawl. The things that you can do are commands.

Tags

A tag is a way to index entities by some piece of information. A tag can have a label and a value, both of which are strings. Many accounts are typed, and you could represent this with a tag where Label is Type and Value is Savings or Checking. You could then run a query to get the account id of all accounts where Label is Type and Value is Savings. The number of savings accounts in the system would be the number of entity ids.

Leases

A lease is like a tag, except that it has a uniqueness constraint. Many banks have online portals, allowing bank members to see their accounts on the internet. From the bank's perspective, all of the accounts should be tied to a member id, probably a guid. But the member will not want to remember nor lookup this guid - they will want to use a username. What you can do in EntityDb is make a lease for member entities where the entity id is the member id, the Label is Username and the Value is whatever username the member wants to use. If an attempt to commit a transaction is made that would violate the uniqueness constraint, it will be rejected. (This is obnoxious behavior for the user, though, so the bank should check before attempting to commit to see if the username is available and give immediate feedback to choose a different username).

Snapshots

A snapshot is a stateful object at a given point in time. They always have an identifier and a version number. Together, the identifier and version number called a pointer. You can request different versions of a given snapshot by using different pointers!

In the context of snapshots, the reserved version number is reserved for pointing to the latest snapshot. So if you want the latest version, you use a pointer with the exact id and the reserved version number. If you want a specific version, you can create pointer with the exact id and version number you want.

The balance on your bank account is a snapshot. You can build that snapshot by summing all of the deposits and withdrawls on your account. If you look at the bank statements, you will most likely see the snapshot of each bank account for that statement, along with all of the deposits, withdrawls, and interest.

Entities

An entity is conceptually an aggregate root inside of a bounded context, and it extends the concept of a snapshot. In the banking example, there are multiple entities. You have a membership at the bank. That's an entity. You probably have a checking account. That's an entity. And you might even have a savings account. That is also an entity!

Which bounded contexts these entiies live in is up to the business.

Projections

A projection is an aggregate, but notably not the aggregate root, and it too extends the concept of a snapshot. In the banking example, one example of a projection could be your entire account balance. It can be anything, though! You are not constrained in what data you want to use for your projection.

Communications

  • Coming Soon!TM

About

A .NET C# implementation of the event sourcing pattern, with a few added features to serve common purposes.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Dec 12, 2022. It is now read-only.

Repository files navigation

EntityDb.NET Codacy BadgeCodacy BadgeBuild

At its core, EntityDb.NET is a set of abstractions and implementations for the Event Sourcing pattern, with the added ability to enforce uniqueness constraints and the ability to tag resources.

What is Event Sourcing?

Event Sourcing centers around the idea that your source of truth is not the current state, it is all of the deltas that add up to the current state. Consider your personal bank - which of these options do you think it their source of truth for account balances?

  • Option A - Table Rows
    • John Doe has $123.45 in Account A
    • Jane Doe has $678.90 in Account B
  • Option B - Transactions
    • John Doe deposited $100.00 in Account A
    • Jane Doe deposited $600.00 in Account B
    • John Doe deposited $20.00 in Account A
    • Jane Doe deposited $70.00 in Account B
    • John Doe deposited $3.45 in Account A
    • Jane Doe deposited $8.90 in Account B

The answer is pretty obvious if you go check your bank statement. They keep a set of transactions, and regurgitate that information on the statement. (If I'm wrong, you should consider getting a new bank, ASAP!)

How does EntityDb.NET implement Event Sourcing?

There are several core objects at the heart of this implementation. Encalsulating these objects are various repositories.

  1. Transaction Repository
    • Agents
    • Commands
    • Tags
    • Leases
  2. Snapshot Repository
    • Snapshots
  3. Entity Repository
    • Transaction Repository
    • Optional: Snapshot Repository
  4. Projection Repository
    • Transaction Repository
    • Optional: Snapshot Repository

Transactions

A transaction represents an atomic operation on multiple entities. A transaction is committed atomically or not at all. If some step in the transaction fails, the entire transaction should fail.

Agents

An agent is an actor that can execute transactions. For example, if a transaction is initiated via an HTTP API, you might use the HttpContextAgent - it's signature includes headers and connection information, and it uses the ClaimsPrincipal to decide if an agent has a particular role required for authorized commands.

Commands

A command represents the intent to perform some operation on a single entity. Going back to the bank account example, one command could be PerformDeposit while another could be PerformWithdrawl. The things that you can do are commands.

Tags

A tag is a way to index entities by some piece of information. A tag can have a label and a value, both of which are strings. Many accounts are typed, and you could represent this with a tag where Label is Type and Value is Savings or Checking. You could then run a query to get the account id of all accounts where Label is Type and Value is Savings. The number of savings accounts in the system would be the number of entity ids.

Leases

A lease is like a tag, except that it has a uniqueness constraint. Many banks have online portals, allowing bank members to see their accounts on the internet. From the bank's perspective, all of the accounts should be tied to a member id, probably a guid. But the member will not want to remember nor lookup this guid - they will want to use a username. What you can do in EntityDb is make a lease for member entities where the entity id is the member id, the Label is Username and the Value is whatever username the member wants to use. If an attempt to commit a transaction is made that would violate the uniqueness constraint, it will be rejected. (This is obnoxious behavior for the user, though, so the bank should check before attempting to commit to see if the username is available and give immediate feedback to choose a different username).

Snapshots

A snapshot is a stateful object at a given point in time. They always have an identifier and a version number. Together, the identifier and version number called a pointer. You can request different versions of a given snapshot by using different pointers!

In the context of snapshots, the reserved version number is reserved for pointing to the latest snapshot. So if you want the latest version, you use a pointer with the exact id and the reserved version number. If you want a specific version, you can create pointer with the exact id and version number you want.

The balance on your bank account is a snapshot. You can build that snapshot by summing all of the deposits and withdrawls on your account. If you look at the bank statements, you will most likely see the snapshot of each bank account for that statement, along with all of the deposits, withdrawls, and interest.

Entities

An entity is conceptually an aggregate root inside of a bounded context, and it extends the concept of a snapshot. In the banking example, there are multiple entities. You have a membership at the bank. That's an entity. You probably have a checking account. That's an entity. And you might even have a savings account. That is also an entity!

Which bounded contexts these entiies live in is up to the business.

Projections

A projection is an aggregate, but notably not the aggregate root, and it too extends the concept of a snapshot. In the banking example, one example of a projection could be your entire account balance. It can be anything, though! You are not constrained in what data you want to use for your projection.

Communications

  • Coming Soon!TM

About

A .NET C# implementation of the event sourcing pattern, with a few added features to serve common purposes.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 12, 2022. It is now read-only.

Repository files navigation

EntityDb.NET Codacy BadgeCodacy BadgeBuild

At its core, EntityDb.NET is a set of abstractions and implementations for the Event Sourcing pattern, with the added ability to enforce uniqueness constraints and the ability to tag resources.

What is Event Sourcing?

Event Sourcing centers around the idea that your source of truth is not the current state, it is all of the deltas that add up to the current state. Consider your personal bank - which of these options do you think it their source of truth for account balances?

  • Option A - Table Rows
    • John Doe has $123.45 in Account A
    • Jane Doe has $678.90 in Account B
  • Option B - Transactions
    • John Doe deposited $100.00 in Account A
    • Jane Doe deposited $600.00 in Account B
    • John Doe deposited $20.00 in Account A
    • Jane Doe deposited $70.00 in Account B
    • John Doe deposited $3.45 in Account A
    • Jane Doe deposited $8.90 in Account B

The answer is pretty obvious if you go check your bank statement. They keep a set of transactions, and regurgitate that information on the statement. (If I'm wrong, you should consider getting a new bank, ASAP!)

How does EntityDb.NET implement Event Sourcing?

There are several core objects at the heart of this implementation. Encalsulating these objects are various repositories.

  1. Transaction Repository
    • Agents
    • Commands
    • Tags
    • Leases
  2. Snapshot Repository
    • Snapshots
  3. Entity Repository
    • Transaction Repository
    • Optional: Snapshot Repository
  4. Projection Repository
    • Transaction Repository
    • Optional: Snapshot Repository

Transactions

A transaction represents an atomic operation on multiple entities. A transaction is committed atomically or not at all. If some step in the transaction fails, the entire transaction should fail.

Agents

An agent is an actor that can execute transactions. For example, if a transaction is initiated via an HTTP API, you might use the HttpContextAgent - it's signature includes headers and connection information, and it uses the ClaimsPrincipal to decide if an agent has a particular role required for authorized commands.

Commands

A command represents the intent to perform some operation on a single entity. Going back to the bank account example, one command could be PerformDeposit while another could be PerformWithdrawl. The things that you can do are commands.

Tags

A tag is a way to index entities by some piece of information. A tag can have a label and a value, both of which are strings. Many accounts are typed, and you could represent this with a tag where Label is Type and Value is Savings or Checking. You could then run a query to get the account id of all accounts where Label is Type and Value is Savings. The number of savings accounts in the system would be the number of entity ids.

Leases

A lease is like a tag, except that it has a uniqueness constraint. Many banks have online portals, allowing bank members to see their accounts on the internet. From the bank's perspective, all of the accounts should be tied to a member id, probably a guid. But the member will not want to remember nor lookup this guid - they will want to use a username. What you can do in EntityDb is make a lease for member entities where the entity id is the member id, the Label is Username and the Value is whatever username the member wants to use. If an attempt to commit a transaction is made that would violate the uniqueness constraint, it will be rejected. (This is obnoxious behavior for the user, though, so the bank should check before attempting to commit to see if the username is available and give immediate feedback to choose a different username).

Snapshots

A snapshot is a stateful object at a given point in time. They always have an identifier and a version number. Together, the identifier and version number called a pointer. You can request different versions of a given snapshot by using different pointers!

In the context of snapshots, the reserved version number is reserved for pointing to the latest snapshot. So if you want the latest version, you use a pointer with the exact id and the reserved version number. If you want a specific version, you can create pointer with the exact id and version number you want.

The balance on your bank account is a snapshot. You can build that snapshot by summing all of the deposits and withdrawls on your account. If you look at the bank statements, you will most likely see the snapshot of each bank account for that statement, along with all of the deposits, withdrawls, and interest.

Entities

An entity is conceptually an aggregate root inside of a bounded context, and it extends the concept of a snapshot. In the banking example, there are multiple entities. You have a membership at the bank. That's an entity. You probably have a checking account. That's an entity. And you might even have a savings account. That is also an entity!

Which bounded contexts these entiies live in is up to the business.

Projections

A projection is an aggregate, but notably not the aggregate root, and it too extends the concept of a snapshot. In the banking example, one example of a projection could be your entire account balance. It can be anything, though! You are not constrained in what data you want to use for your projection.

Communications

  • Coming Soon!TM

About

A .NET C# implementation of the event sourcing pattern, with a few added features to serve common purposes.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 12, 2022. It is now read-only.

Repository files navigation

EntityDb.NET Codacy BadgeCodacy BadgeBuild

At its core, EntityDb.NET is a set of abstractions and implementations for the Event Sourcing pattern, with the added ability to enforce uniqueness constraints and the ability to tag resources.

What is Event Sourcing?

Event Sourcing centers around the idea that your source of truth is not the current state, it is all of the deltas that add up to the current state. Consider your personal bank - which of these options do you think it their source of truth for account balances?

  • Option A - Table Rows
    • John Doe has $123.45 in Account A
    • Jane Doe has $678.90 in Account B
  • Option B - Transactions
    • John Doe deposited $100.00 in Account A
    • Jane Doe deposited $600.00 in Account B
    • John Doe deposited $20.00 in Account A
    • Jane Doe deposited $70.00 in Account B
    • John Doe deposited $3.45 in Account A
    • Jane Doe deposited $8.90 in Account B

The answer is pretty obvious if you go check your bank statement. They keep a set of transactions, and regurgitate that information on the statement. (If I'm wrong, you should consider getting a new bank, ASAP!)

How does EntityDb.NET implement Event Sourcing?

There are several core objects at the heart of this implementation. Encalsulating these objects are various repositories.

  1. Transaction Repository
    • Agents
    • Commands
    • Tags
    • Leases
  2. Snapshot Repository
    • Snapshots
  3. Entity Repository
    • Transaction Repository
    • Optional: Snapshot Repository
  4. Projection Repository
    • Transaction Repository
    • Optional: Snapshot Repository

Transactions

A transaction represents an atomic operation on multiple entities. A transaction is committed atomically or not at all. If some step in the transaction fails, the entire transaction should fail.

Agents

An agent is an actor that can execute transactions. For example, if a transaction is initiated via an HTTP API, you might use the HttpContextAgent - it's signature includes headers and connection information, and it uses the ClaimsPrincipal to decide if an agent has a particular role required for authorized commands.

Commands

A command represents the intent to perform some operation on a single entity. Going back to the bank account example, one command could be PerformDeposit while another could be PerformWithdrawl. The things that you can do are commands.

Tags

A tag is a way to index entities by some piece of information. A tag can have a label and a value, both of which are strings. Many accounts are typed, and you could represent this with a tag where Label is Type and Value is Savings or Checking. You could then run a query to get the account id of all accounts where Label is Type and Value is Savings. The number of savings accounts in the system would be the number of entity ids.

Leases

A lease is like a tag, except that it has a uniqueness constraint. Many banks have online portals, allowing bank members to see their accounts on the internet. From the bank's perspective, all of the accounts should be tied to a member id, probably a guid. But the member will not want to remember nor lookup this guid - they will want to use a username. What you can do in EntityDb is make a lease for member entities where the entity id is the member id, the Label is Username and the Value is whatever username the member wants to use. If an attempt to commit a transaction is made that would violate the uniqueness constraint, it will be rejected. (This is obnoxious behavior for the user, though, so the bank should check before attempting to commit to see if the username is available and give immediate feedback to choose a different username).

Snapshots

A snapshot is a stateful object at a given point in time. They always have an identifier and a version number. Together, the identifier and version number called a pointer. You can request different versions of a given snapshot by using different pointers!

In the context of snapshots, the reserved version number is reserved for pointing to the latest snapshot. So if you want the latest version, you use a pointer with the exact id and the reserved version number. If you want a specific version, you can create pointer with the exact id and version number you want.

The balance on your bank account is a snapshot. You can build that snapshot by summing all of the deposits and withdrawls on your account. If you look at the bank statements, you will most likely see the snapshot of each bank account for that statement, along with all of the deposits, withdrawls, and interest.

Entities

An entity is conceptually an aggregate root inside of a bounded context, and it extends the concept of a snapshot. In the banking example, there are multiple entities. You have a membership at the bank. That's an entity. You probably have a checking account. That's an entity. And you might even have a savings account. That is also an entity!

Which bounded contexts these entiies live in is up to the business.

Projections

A projection is an aggregate, but notably not the aggregate root, and it too extends the concept of a snapshot. In the banking example, one example of a projection could be your entire account balance. It can be anything, though! You are not constrained in what data you want to use for your projection.

Communications

  • Coming Soon!TM

About

A .NET C# implementation of the event sourcing pattern, with a few added features to serve common purposes.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Dec 12, 2022. It is now read-only.

Repository files navigation

EntityDb.NET Codacy BadgeCodacy BadgeBuild

At its core, EntityDb.NET is a set of abstractions and implementations for the Event Sourcing pattern, with the added ability to enforce uniqueness constraints and the ability to tag resources.

What is Event Sourcing?

Event Sourcing centers around the idea that your source of truth is not the current state, it is all of the deltas that add up to the current state. Consider your personal bank - which of these options do you think it their source of truth for account balances?

  • Option A - Table Rows
    • John Doe has $123.45 in Account A
    • Jane Doe has $678.90 in Account B
  • Option B - Transactions
    • John Doe deposited $100.00 in Account A
    • Jane Doe deposited $600.00 in Account B
    • John Doe deposited $20.00 in Account A
    • Jane Doe deposited $70.00 in Account B
    • John Doe deposited $3.45 in Account A
    • Jane Doe deposited $8.90 in Account B

The answer is pretty obvious if you go check your bank statement. They keep a set of transactions, and regurgitate that information on the statement. (If I'm wrong, you should consider getting a new bank, ASAP!)

How does EntityDb.NET implement Event Sourcing?

There are several core objects at the heart of this implementation. Encalsulating these objects are various repositories.

  1. Transaction Repository
    • Agents
    • Commands
    • Tags
    • Leases
  2. Snapshot Repository
    • Snapshots
  3. Entity Repository
    • Transaction Repository
    • Optional: Snapshot Repository
  4. Projection Repository
    • Transaction Repository
    • Optional: Snapshot Repository

Transactions

A transaction represents an atomic operation on multiple entities. A transaction is committed atomically or not at all. If some step in the transaction fails, the entire transaction should fail.

Agents

An agent is an actor that can execute transactions. For example, if a transaction is initiated via an HTTP API, you might use the HttpContextAgent - it's signature includes headers and connection information, and it uses the ClaimsPrincipal to decide if an agent has a particular role required for authorized commands.

Commands

A command represents the intent to perform some operation on a single entity. Going back to the bank account example, one command could be PerformDeposit while another could be PerformWithdrawl. The things that you can do are commands.

Tags

A tag is a way to index entities by some piece of information. A tag can have a label and a value, both of which are strings. Many accounts are typed, and you could represent this with a tag where Label is Type and Value is Savings or Checking. You could then run a query to get the account id of all accounts where Label is Type and Value is Savings. The number of savings accounts in the system would be the number of entity ids.

Leases

A lease is like a tag, except that it has a uniqueness constraint. Many banks have online portals, allowing bank members to see their accounts on the internet. From the bank's perspective, all of the accounts should be tied to a member id, probably a guid. But the member will not want to remember nor lookup this guid - they will want to use a username. What you can do in EntityDb is make a lease for member entities where the entity id is the member id, the Label is Username and the Value is whatever username the member wants to use. If an attempt to commit a transaction is made that would violate the uniqueness constraint, it will be rejected. (This is obnoxious behavior for the user, though, so the bank should check before attempting to commit to see if the username is available and give immediate feedback to choose a different username).

Snapshots

A snapshot is a stateful object at a given point in time. They always have an identifier and a version number. Together, the identifier and version number called a pointer. You can request different versions of a given snapshot by using different pointers!

In the context of snapshots, the reserved version number is reserved for pointing to the latest snapshot. So if you want the latest version, you use a pointer with the exact id and the reserved version number. If you want a specific version, you can create pointer with the exact id and version number you want.

The balance on your bank account is a snapshot. You can build that snapshot by summing all of the deposits and withdrawls on your account. If you look at the bank statements, you will most likely see the snapshot of each bank account for that statement, along with all of the deposits, withdrawls, and interest.

Entities

An entity is conceptually an aggregate root inside of a bounded context, and it extends the concept of a snapshot. In the banking example, there are multiple entities. You have a membership at the bank. That's an entity. You probably have a checking account. That's an entity. And you might even have a savings account. That is also an entity!

Which bounded contexts these entiies live in is up to the business.

Projections

A projection is an aggregate, but notably not the aggregate root, and it too extends the concept of a snapshot. In the banking example, one example of a projection could be your entire account balance. It can be anything, though! You are not constrained in what data you want to use for your projection.

Communications

  • Coming Soon!TM

About

A .NET C# implementation of the event sourcing pattern, with a few added features to serve common purposes.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 12, 2022. It is now read-only.

Repository files navigation

EntityDb.NET Codacy BadgeCodacy BadgeBuild

At its core, EntityDb.NET is a set of abstractions and implementations for the Event Sourcing pattern, with the added ability to enforce uniqueness constraints and the ability to tag resources.

What is Event Sourcing?

Event Sourcing centers around the idea that your source of truth is not the current state, it is all of the deltas that add up to the current state. Consider your personal bank - which of these options do you think it their source of truth for account balances?

  • Option A - Table Rows
    • John Doe has $123.45 in Account A
    • Jane Doe has $678.90 in Account B
  • Option B - Transactions
    • John Doe deposited $100.00 in Account A
    • Jane Doe deposited $600.00 in Account B
    • John Doe deposited $20.00 in Account A
    • Jane Doe deposited $70.00 in Account B
    • John Doe deposited $3.45 in Account A
    • Jane Doe deposited $8.90 in Account B

The answer is pretty obvious if you go check your bank statement. They keep a set of transactions, and regurgitate that information on the statement. (If I'm wrong, you should consider getting a new bank, ASAP!)

How does EntityDb.NET implement Event Sourcing?

There are several core objects at the heart of this implementation. Encalsulating these objects are various repositories.

  1. Transaction Repository
    • Agents
    • Commands
    • Tags
    • Leases
  2. Snapshot Repository
    • Snapshots
  3. Entity Repository
    • Transaction Repository
    • Optional: Snapshot Repository
  4. Projection Repository
    • Transaction Repository
    • Optional: Snapshot Repository

Transactions

A transaction represents an atomic operation on multiple entities. A transaction is committed atomically or not at all. If some step in the transaction fails, the entire transaction should fail.

Agents

An agent is an actor that can execute transactions. For example, if a transaction is initiated via an HTTP API, you might use the HttpContextAgent - it's signature includes headers and connection information, and it uses the ClaimsPrincipal to decide if an agent has a particular role required for authorized commands.

Commands

A command represents the intent to perform some operation on a single entity. Going back to the bank account example, one command could be PerformDeposit while another could be PerformWithdrawl. The things that you can do are commands.

Tags

A tag is a way to index entities by some piece of information. A tag can have a label and a value, both of which are strings. Many accounts are typed, and you could represent this with a tag where Label is Type and Value is Savings or Checking. You could then run a query to get the account id of all accounts where Label is Type and Value is Savings. The number of savings accounts in the system would be the number of entity ids.

Leases

A lease is like a tag, except that it has a uniqueness constraint. Many banks have online portals, allowing bank members to see their accounts on the internet. From the bank's perspective, all of the accounts should be tied to a member id, probably a guid. But the member will not want to remember nor lookup this guid - they will want to use a username. What you can do in EntityDb is make a lease for member entities where the entity id is the member id, the Label is Username and the Value is whatever username the member wants to use. If an attempt to commit a transaction is made that would violate the uniqueness constraint, it will be rejected. (This is obnoxious behavior for the user, though, so the bank should check before attempting to commit to see if the username is available and give immediate feedback to choose a different username).

Snapshots

A snapshot is a stateful object at a given point in time. They always have an identifier and a version number. Together, the identifier and version number called a pointer. You can request different versions of a given snapshot by using different pointers!

In the context of snapshots, the reserved version number is reserved for pointing to the latest snapshot. So if you want the latest version, you use a pointer with the exact id and the reserved version number. If you want a specific version, you can create pointer with the exact id and version number you want.

The balance on your bank account is a snapshot. You can build that snapshot by summing all of the deposits and withdrawls on your account. If you look at the bank statements, you will most likely see the snapshot of each bank account for that statement, along with all of the deposits, withdrawls, and interest.

Entities

An entity is conceptually an aggregate root inside of a bounded context, and it extends the concept of a snapshot. In the banking example, there are multiple entities. You have a membership at the bank. That's an entity. You probably have a checking account. That's an entity. And you might even have a savings account. That is also an entity!

Which bounded contexts these entiies live in is up to the business.

Projections

A projection is an aggregate, but notably not the aggregate root, and it too extends the concept of a snapshot. In the banking example, one example of a projection could be your entire account balance. It can be anything, though! You are not constrained in what data you want to use for your projection.

Communications

  • Coming Soon!TM

About

A .NET C# implementation of the event sourcing pattern, with a few added features to serve common purposes.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 12, 2022. It is now read-only.

Repository files navigation

EntityDb.NET Codacy BadgeCodacy BadgeBuild

At its core, EntityDb.NET is a set of abstractions and implementations for the Event Sourcing pattern, with the added ability to enforce uniqueness constraints and the ability to tag resources.

What is Event Sourcing?

Event Sourcing centers around the idea that your source of truth is not the current state, it is all of the deltas that add up to the current state. Consider your personal bank - which of these options do you think it their source of truth for account balances?

  • Option A - Table Rows
    • John Doe has $123.45 in Account A
    • Jane Doe has $678.90 in Account B
  • Option B - Transactions
    • John Doe deposited $100.00 in Account A
    • Jane Doe deposited $600.00 in Account B
    • John Doe deposited $20.00 in Account A
    • Jane Doe deposited $70.00 in Account B
    • John Doe deposited $3.45 in Account A
    • Jane Doe deposited $8.90 in Account B

The answer is pretty obvious if you go check your bank statement. They keep a set of transactions, and regurgitate that information on the statement. (If I'm wrong, you should consider getting a new bank, ASAP!)

How does EntityDb.NET implement Event Sourcing?

There are several core objects at the heart of this implementation. Encalsulating these objects are various repositories.

  1. Transaction Repository
    • Agents
    • Commands
    • Tags
    • Leases
  2. Snapshot Repository
    • Snapshots
  3. Entity Repository
    • Transaction Repository
    • Optional: Snapshot Repository
  4. Projection Repository
    • Transaction Repository
    • Optional: Snapshot Repository

Transactions

A transaction represents an atomic operation on multiple entities. A transaction is committed atomically or not at all. If some step in the transaction fails, the entire transaction should fail.

Agents

An agent is an actor that can execute transactions. For example, if a transaction is initiated via an HTTP API, you might use the HttpContextAgent - it's signature includes headers and connection information, and it uses the ClaimsPrincipal to decide if an agent has a particular role required for authorized commands.

Commands

A command represents the intent to perform some operation on a single entity. Going back to the bank account example, one command could be PerformDeposit while another could be PerformWithdrawl. The things that you can do are commands.

Tags

A tag is a way to index entities by some piece of information. A tag can have a label and a value, both of which are strings. Many accounts are typed, and you could represent this with a tag where Label is Type and Value is Savings or Checking. You could then run a query to get the account id of all accounts where Label is Type and Value is Savings. The number of savings accounts in the system would be the number of entity ids.

Leases

A lease is like a tag, except that it has a uniqueness constraint. Many banks have online portals, allowing bank members to see their accounts on the internet. From the bank's perspective, all of the accounts should be tied to a member id, probably a guid. But the member will not want to remember nor lookup this guid - they will want to use a username. What you can do in EntityDb is make a lease for member entities where the entity id is the member id, the Label is Username and the Value is whatever username the member wants to use. If an attempt to commit a transaction is made that would violate the uniqueness constraint, it will be rejected. (This is obnoxious behavior for the user, though, so the bank should check before attempting to commit to see if the username is available and give immediate feedback to choose a different username).

Snapshots

A snapshot is a stateful object at a given point in time. They always have an identifier and a version number. Together, the identifier and version number called a pointer. You can request different versions of a given snapshot by using different pointers!

In the context of snapshots, the reserved version number is reserved for pointing to the latest snapshot. So if you want the latest version, you use a pointer with the exact id and the reserved version number. If you want a specific version, you can create pointer with the exact id and version number you want.

The balance on your bank account is a snapshot. You can build that snapshot by summing all of the deposits and withdrawls on your account. If you look at the bank statements, you will most likely see the snapshot of each bank account for that statement, along with all of the deposits, withdrawls, and interest.

Entities

An entity is conceptually an aggregate root inside of a bounded context, and it extends the concept of a snapshot. In the banking example, there are multiple entities. You have a membership at the bank. That's an entity. You probably have a checking account. That's an entity. And you might even have a savings account. That is also an entity!

Which bounded contexts these entiies live in is up to the business.

Projections

A projection is an aggregate, but notably not the aggregate root, and it too extends the concept of a snapshot. In the banking example, one example of a projection could be your entire account balance. It can be anything, though! You are not constrained in what data you want to use for your projection.

Communications

  • Coming Soon!TM

About

A .NET C# implementation of the event sourcing pattern, with a few added features to serve common purposes.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Dec 12, 2022. It is now read-only.

Repository files navigation

EntityDb.NET Codacy BadgeCodacy BadgeBuild

At its core, EntityDb.NET is a set of abstractions and implementations for the Event Sourcing pattern, with the added ability to enforce uniqueness constraints and the ability to tag resources.

What is Event Sourcing?

Event Sourcing centers around the idea that your source of truth is not the current state, it is all of the deltas that add up to the current state. Consider your personal bank - which of these options do you think it their source of truth for account balances?

  • Option A - Table Rows
    • John Doe has $123.45 in Account A
    • Jane Doe has $678.90 in Account B
  • Option B - Transactions
    • John Doe deposited $100.00 in Account A
    • Jane Doe deposited $600.00 in Account B
    • John Doe deposited $20.00 in Account A
    • Jane Doe deposited $70.00 in Account B
    • John Doe deposited $3.45 in Account A
    • Jane Doe deposited $8.90 in Account B

The answer is pretty obvious if you go check your bank statement. They keep a set of transactions, and regurgitate that information on the statement. (If I'm wrong, you should consider getting a new bank, ASAP!)

How does EntityDb.NET implement Event Sourcing?

There are several core objects at the heart of this implementation. Encalsulating these objects are various repositories.

  1. Transaction Repository
    • Agents
    • Commands
    • Tags
    • Leases
  2. Snapshot Repository
    • Snapshots
  3. Entity Repository
    • Transaction Repository
    • Optional: Snapshot Repository
  4. Projection Repository
    • Transaction Repository
    • Optional: Snapshot Repository

Transactions

A transaction represents an atomic operation on multiple entities. A transaction is committed atomically or not at all. If some step in the transaction fails, the entire transaction should fail.

Agents

An agent is an actor that can execute transactions. For example, if a transaction is initiated via an HTTP API, you might use the HttpContextAgent - it's signature includes headers and connection information, and it uses the ClaimsPrincipal to decide if an agent has a particular role required for authorized commands.

Commands

A command represents the intent to perform some operation on a single entity. Going back to the bank account example, one command could be PerformDeposit while another could be PerformWithdrawl. The things that you can do are commands.

Tags

A tag is a way to index entities by some piece of information. A tag can have a label and a value, both of which are strings. Many accounts are typed, and you could represent this with a tag where Label is Type and Value is Savings or Checking. You could then run a query to get the account id of all accounts where Label is Type and Value is Savings. The number of savings accounts in the system would be the number of entity ids.

Leases

A lease is like a tag, except that it has a uniqueness constraint. Many banks have online portals, allowing bank members to see their accounts on the internet. From the bank's perspective, all of the accounts should be tied to a member id, probably a guid. But the member will not want to remember nor lookup this guid - they will want to use a username. What you can do in EntityDb is make a lease for member entities where the entity id is the member id, the Label is Username and the Value is whatever username the member wants to use. If an attempt to commit a transaction is made that would violate the uniqueness constraint, it will be rejected. (This is obnoxious behavior for the user, though, so the bank should check before attempting to commit to see if the username is available and give immediate feedback to choose a different username).

Snapshots

A snapshot is a stateful object at a given point in time. They always have an identifier and a version number. Together, the identifier and version number called a pointer. You can request different versions of a given snapshot by using different pointers!

In the context of snapshots, the reserved version number is reserved for pointing to the latest snapshot. So if you want the latest version, you use a pointer with the exact id and the reserved version number. If you want a specific version, you can create pointer with the exact id and version number you want.

The balance on your bank account is a snapshot. You can build that snapshot by summing all of the deposits and withdrawls on your account. If you look at the bank statements, you will most likely see the snapshot of each bank account for that statement, along with all of the deposits, withdrawls, and interest.

Entities

An entity is conceptually an aggregate root inside of a bounded context, and it extends the concept of a snapshot. In the banking example, there are multiple entities. You have a membership at the bank. That's an entity. You probably have a checking account. That's an entity. And you might even have a savings account. That is also an entity!

Which bounded contexts these entiies live in is up to the business.

Projections

A projection is an aggregate, but notably not the aggregate root, and it too extends the concept of a snapshot. In the banking example, one example of a projection could be your entire account balance. It can be anything, though! You are not constrained in what data you want to use for your projection.

Communications

  • Coming Soon!TM

About

A .NET C# implementation of the event sourcing pattern, with a few added features to serve common purposes.

Resources

Code of conduct

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages