Skip to content
This repository was archived by the owner on Dec 23, 2024. It is now read-only.

Commit 193b66c

Browse files
jt185133jltrem
authored andcommitted
Refactor Repository to be 'F# first'; eliminate IRepository
1 parent 5696e5f commit 193b66c

File tree

6 files changed

+30
-42
lines changed

6 files changed

+30
-42
lines changed

samples/CrmDomain/Aggregate.Contact.fs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ module CrmDomain.Aggregate.Contact
22

33
open System
44
open Fescq.Core
5-
open Fescq.Repository
65
open CrmDomain
76

87
type Contact = {
@@ -216,20 +215,16 @@ module private Storage =
216215
ex -> Error ex.Message
217216

218217
let load (store:EventStore) (aggId:Guid) =
219-
Repository<Contact> store
220-
:> IRepository<Contact>
221-
|> fun x -> x.Load(aggId, factory)
218+
Fescq.Repository.create<Contact> store
219+
|> fun x -> x.Load aggId factory
222220

223221
let loadExpectedVersion (store:EventStore) (aggId:Guid) (expectedVersion:int) =
224-
Repository<Contact> store
225-
:> IRepository<Contact>
226-
|> fun x -> x.LoadExpectedVersion(aggId, factory, expectedVersion)
222+
Fescq.Repository.create<Contact> store
223+
|> fun x -> x.LoadExpectedVersion aggId factory expectedVersion
227224

228225
let save (store:EventStore) (update:Agg<Contact> * Event list) =
229-
230-
Repository<Contact> store
231-
:> IRepository<Contact>
232-
|> fun x -> x.Save(fst update, snd update)
226+
Fescq.Repository.create<Contact> store
227+
|> fun x -> x.Save (fst update) (snd update)
233228

234229

235230
module Workflow =

samples/CrmDomain/CSharp.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type ContactWorkflow private () =
1717
static member Update (getUtcNow:System.Func<DateTimeOffset>, store:EventStore, aggId:Guid, metaData:string, cmd:Fescq.Command.UpdateCommand) =
1818
Contact.Workflow.update (fun () -> getUtcNow.Invoke()) store aggId metaData cmd
1919
|> function
20-
| Ok agg -> agg
20+
| Ok x -> x
2121
| Error msg -> failwith msg
2222

2323
static member Load (store:EventStore, aggId:Guid) =

samples/NetCoreWebApp/Controllers/api/ContactCommandController.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,13 @@ public async Task<ActionResult> AddPhone(Guid aggregateId, Guid phoneId, [FromBo
7878
private async Task<ActionResult> UpdateAsync(Guid aggregateId, Fescq.Command.UpdateCommand cmd) =>
7979
await Task.Run(() =>
8080

81-
Try(() => ContactWorkflow.Update(() => TimestampNow, _eventStore, aggregateId, "", cmd))
81+
Try(() =>
82+
{
83+
ContactWorkflow.Update(() => TimestampNow, _eventStore, aggregateId, "", cmd);
84+
return Unit.Default;
85+
})
8286
.Match(
83-
Succ: result => Ok(),
87+
Succ: _ => Ok(),
8488
Fail: ex => ErrorResultAsBadRequest(ex))
8589
);
8690

src/Fescq/Core.fs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,9 @@ type EventStore = {
6868
AddEvent: Event -> Result<unit, string>
6969
Save: unit -> Result<unit, string>
7070
}
71+
72+
type AggRepository<'t> = {
73+
Load : Guid-> (Event list -> Result<Agg<'t>, string>) -> Result<Agg<'t>, string>
74+
LoadExpectedVersion : Guid -> (Event list -> Result<Agg<'t>, string>) -> int -> Result<Agg<'t>, string>
75+
Save : Agg<'t> -> Event list -> Result<unit, string>
76+
}

src/Fescq/EventStore.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ let create (registry:RegisteredEvents) (getEvents:DtoTypeProvider -> Guid -> seq
4646
ex -> Error ex.Message
4747

4848

49-
{ EventStore.Registry = registry
49+
{ Registry = registry
5050
GetEvents = getEvents
5151
AddEvent = addEvent
5252
Save = save }

src/Fescq/Repository.fs

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,18 @@ module Fescq.Repository
22

33
open System
44
open Core
5-
open EventStore
65

7-
type IRepository<'t> =
8-
9-
abstract member Save : Agg<'t> * Event list -> Result<Agg<'t>, string>
6+
let create<'t> (eventStore:EventStore) =
107

118
/// input: aggregate ID * factory
129
/// output: aggregate
13-
abstract member Load : Guid * (Event list -> Result<Agg<'t>, string>) -> Result<Agg<'t>, string>
14-
15-
/// input: aggregate ID * factory * expectedVersion
16-
/// output: aggregate
17-
abstract member LoadExpectedVersion : Guid * (Event list -> Result<Agg<'t>, string>) * int -> Result<Agg<'t>, string>
18-
19-
20-
type Repository<'t> (storage:EventStore) =
21-
2210
let load (aggregateId:Guid) (factory:(Event list -> Result<Agg<'t>, string>)) =
2311
aggregateId
24-
|> storage.GetEvents
12+
|> eventStore.GetEvents
2513
|> Result.bind factory
2614

15+
/// input: aggregate ID * factory * expectedVersion
16+
/// output: aggregate
2717
let loadExpectedVersion (aggregateId:Guid) (factory:(Event list -> Result<Agg<'t>, string>)) (expectedVersion:int) =
2818
load aggregateId factory
2919
|> Result.bind (fun x ->
@@ -42,24 +32,17 @@ type Repository<'t> (storage:EventStore) =
4232
|> List.unfold (fun events ->
4333
match events with
4434
| head :: tail ->
45-
match storage.AddEvent head with
35+
match eventStore.AddEvent head with
4636
| Ok _ -> Some (Ok (), tail)
4737
| Error msg -> Some (Error msg, [])
4838
| [] -> None)
4939

5040
|> List.last
51-
|> Result.bind storage.Save
52-
|> Result.bind (fun _ -> aggregate |> Ok)
41+
|> Result.bind eventStore.Save
42+
|> Result.bind (fun x -> x |> Ok)
5343
else
5444
Error "unpersisted events must be part of aggregate history"
5545

56-
interface IRepository<'t> with
57-
58-
member x.Load (aggregateId:Guid, factory:(Event list -> Result<Agg<'t>, string>)) =
59-
load aggregateId factory
60-
61-
member x.LoadExpectedVersion (aggregateId:Guid, factory:(Event list -> Result<Agg<'t>, string>), expectedVersion:int) =
62-
loadExpectedVersion aggregateId factory expectedVersion
63-
64-
member x.Save (aggregate:Agg<'t>, unpersisted:Event list) =
65-
save aggregate unpersisted
46+
{ Load = load
47+
LoadExpectedVersion = loadExpectedVersion
48+
Save = save }

0 commit comments

Comments
 (0)