Nyeste poster
-
-
CQRS - Introduksjon
-
Hvordan bruke app_offline
-
Anbefalte extensions i VS Code
-
Konverter til Jenkinsfile og Multibranch pipeline
-
Egendefinerte headere i AWS Amplify
-
Introduksjon til Docker og kontainere
-
Em versus Rem
-
MES- og ERP-systemer
-
Endre build settings i AWS Amplify
-
SCSS feil ved bruk av verdier med ulike benevninger
-
Opprett egendefinert release i Octopus deploy
-
Slå av before og after
-
Sommertid og vintertid
-
Redeploy av bygg med nye variabler i Octopus deploy
-
Krympe transaksjonslog i SQL
-
Recovery mode i SQL server
-
Beskjære bilder I GIMP
-
Sett ny tid med MomentJS
-
Windows Platform FIPS
-
Opprett ny unik UUID I SQL
-
Legg til kun en rad om den ikke finnes
-
Hvordan raskt kopiere en hel tabell i SQL Server
-
IIS Application Pool - liten oversikt
-
Find Og Exist I Linq
-
Single vs SingleOrDefault
-
Avslutte en textarea tagg
-
Løkker i React behøver en unik nøkkel
-
Printe objekter med console log
-
IsolatedModul Error in React
-
Lazy lasting av bilder
-
Smooth scrolling
-
Tastaturnavigasjon mellom artikler
-
Fixed my footer on smaller viewports
-
Download attributtet i html
-
100vh viewport bugfix
-
Hvordan bruke Hugo sin Summary funksjon
-
Konvertere strenger til nummer i Javascript
-
Refactor Ajax til Fetch
-
Window.onerror virker ikke i AngularJS
-
Window.onerror i chrome
-
Overflow:hidden behøver position:relative
-
Angre 'git stash pop' som ender i en mergekonflikt
-
Switch-utrykk i C# krever en konstant verdi
-
Pattern matching i C#
-
React Hooks og Context API
-
Bruk Windows credensials til å lagre Git passord
-
Linq .Include
-
C# sealed class
-
Border Box
-
C# params
-
Endre navn på tabeller i T-SQL
-
Hvordan bruke DataTestMethod
-
C# extension metoder
-
Bruke HashSet for å håndtere i C#
-
Hvordan bruke JSON_QUERY i T-SQL
-
Slette brancher i git
-
Reduser lastehastigheten i Chrome
-
C# SelectMany
-
CSS white space property
CQS står for Command Query Separation.
CQRS står for Command Query Responsibility Segregation.
Både CQS and CQRS har Command og Query i navnet sitt. Command en forespørsel/request for å endre noe (for eksempel data). Query er en forespørsel for returnere data.
CQS pattern blei oppfunnet av Bertrand Meyer mens han jobbet med programmeringsspråket Eiffel . Han kom opp med følgende 2 læresetninger:
“Asking a question should not change the answer”
og
“A command (procedure) does something but does not return a result. A query (function or attribute) returns a result but does not change the state.”
Med en slik split blir prosessering enkelt å forutsi resultatet på; En query vil ikke skape noen ukjente sideeffekter og en command vil aldri blir benyttet for å hente data (for eksempel fra en database).
CQRS er en utvidelse av CQS. Greg Young sa det på følgende vis:
“Command and Query Responsibility Segregation uses the same definition of Commands and Queries that Meyer used and maintains the viewpoint that they should be pure. The fundamental difference is that in CQRS objects are split into two objects, one containing the Commands one containing the Queries.”
CQRS er et parttern hvor vi segregerer oppførelsene til applikasjonen. Vi splitter den inn i 2 hoveddeler: kommandoer og spørringer. Kommandoer skal gjøre noe, queries skal hente noe. Litt som at et spørsmål ikke skal kunne endre et svar
namespace ReadModel
{
public interface ProductsDao
{
ProductDisplay FindById(int productId);
ICollection<ProductDisplay> FindByName(string name);
ICollection<ProductInventory> FindOutOfStockProducts();
ICollection<ProductDisplay> FindRelatedProducts(int productId);
}
public class ProductDisplay
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal UnitPrice { get; set; }
public bool IsOutOfStock { get; set; }
public double UserRating { get; set; }
}
public class ProductInventory
{
public int Id { get; set; }
public string Name { get; set; }
public int CurrentStock { get; set; }
}
}
public interface ICommand
{
Guid Id { get; }
}
public class RateProduct : ICommand
{
public RateProduct()
{
this.Id = Guid.NewGuid();
}
public Guid Id { get; set; }
public int ProductId { get; set; }
public int Rating { get; set; }
public int UserId {get; set; }
}
public class ProductsCommandHandler :
ICommandHandler<AddNewProduct>,
ICommandHandler<RateProduct>,
ICommandHandler<AddToInventory>,
ICommandHandler<ConfirmItemShipped>,
ICommandHandler<UpdateStockFromInventoryRecount>
{
private readonly IRepository<Product> repository;
public ProductsCommandHandler (IRepository<Product> repository)
{
this.repository = repository;
}
void Handle (AddNewProduct command)
{
...
}
void Handle (RateProduct command)
{
var product = repository.Find(command.ProductId);
if (product != null)
{
product.RateProduct(command.UserId, command.Rating);
repository.Save(product);
}
}
void Handle (AddToInventory command)
{
...
}
void Handle (ConfirmItemsShipped command)
{
...
}
void Handle (UpdateStockFromInventoryRecount command)
{
...
}
}