Tänkte kika hur ni tänker i liknande scenarion. Hej, auctionService.MakeBid(Auction auction, decimal bid, UserAccount userAccount) Har funderat lite mer på min fråga.Arkitekturfråga angående persistens
Säg att vi har en klassen
Auction
Klassen innehåller metoden AddBid(decimal bid).
Skall metoden AddBid se till att budet lagras direkt med ett anrop till en repository?
Eller skall utvecklaren bli tvungen att utföra.
auction.AddBid(decimal bid);
session.Save(auction);
Budet måste ju vara över dom nuvarande så en kontroll mot datakällan bör väl göras i vilket fall som helst. Annars kan det ju ske fel vid budgivandet.
Samma sak är det ju egentligen med ChangePassword(string oldPassword, string newPassword);
Men inte när man gör en Person.Name = "Niclas";
Hur tänker ni? Tycker ni att man låser sin domänmodell för mycket mot repositories eller är det egentligen helt okej i dessa fall.Sv: Arkitekturfråga angående persistens
Jag skulle antingen låta det sparas när man sparar Auctionen, men det beror på om det är ett tillstånd eller en handling. Är det en handling vill man nog spara det rätt omgående då skulle jag ev ha en AuctionService som i sin tur nyttjar repositories. Där AuctionService har en metod som ser till så biddet sparas till rätt Auction i DBn.
mvh JohanSv:Arkitekturfråga angående persistens
{
// Validera inparameterar.
// Validera budet.
// Lägg till budet till auction.
// Spara
}Sv: Arkitekturfråga angående persistens
Alternativet hade ju varit att koppla
MakeBid på Auction
[Kod]
auction.MakeBid(decimal bid, User user)
{
// Hämta repository eller liknande för Auction. (via factory/event eller liknande).
if(!auctionRepository.IsHighestBid(this, bid))
{
throw InvalidOperationException("...");
}
Bid newBid = new Bid(User, bid);
this.currentBid = newBid;
this.Bids.Add(newBid);
auctionRepository.Save(this);
}
[/Kod]
Alternativt om man inte vill att hela auktionen skall sparas.
[Kod]
auction.MakeBid(decimal bid, User user)
{
// Hämta repository eller liknande för Auction.
if(!auctionRepository.IsHighestBid(this, bid))
{
throw InvalidOperationException("...");
}
Bid newBid = new Bid(User, bid);
this.currentBid = newBid;
this.Bids.Add(newBid);
auctionRepository.SaveBid(this, newBid);
}
[/Kod]
Ännu ett alternativ kanske hade varit att lägga ut auctionRepository.IsHighestBid(this, bid) och SaveBid som event där någon som lyssnar på event sköter nersparandet då blir det ganska löst kopplat men mer kompext vilket jag vill undvika.
Hur hade ni gjort i dessa situationer där ändringen i objektmodellen måste kontrolleras mot lagringen? Och helst spara ner förändringen direkt.