@@ -19,8 +19,9 @@ module Domain =
1919 | Unfavorited of Unfavorited
2020 interface TypeShape.UnionContract.IUnionContract
2121 let codec = FsCodec.NewtonsoftJson.Codec.Create< Event>()
22+ let (| For |) ( id : ClientId ) = Equinox.AggregateId( " Favorites" , ClientId.toString id)
2223
23- module Folds =
24+ module Fold =
2425
2526 type State = Events.Favorited []
2627
@@ -50,44 +51,42 @@ module Domain =
5051 | Favorite of date : System.DateTimeOffset * skuIds : SkuId list
5152 | Unfavorite of skuId : SkuId
5253
53- module Commands =
54- let interpret command ( state : Folds.State ) =
55- let doesntHave skuId = state |> Array.exists ( fun x -> x.skuId = skuId) |> not
56- match command with
57- | Favorite ( date = date; skuIds = skuIds) ->
58- [ for skuId in Seq.distinct skuIds do
59- if doesntHave skuId then
60- yield Events.Favorited { date = date; skuId = skuId } ]
61- | Unfavorite skuId ->
62- if doesntHave skuId then [] else
63- [ Events.Unfavorited { skuId = skuId } ]
64-
65- type Service ( log , resolveStream , ? maxAttempts ) =
66-
67- let (| AggregateId |) ( id : ClientId ) = Equinox.AggregateId( " Favorites" , ClientId.toString id)
68- let (| Stream |) ( AggregateId id ) = Equinox.Stream( log, resolveStream id, defaultArg maxAttempts 2 )
69- let execute ( Stream stream ) command : Async < unit > =
70- stream.Transact( Commands.interpret command)
71- let read ( Stream stream ) : Async < Events.Favorited []> =
72- stream.Query id
54+ let interpret command ( state : Fold.State ) =
55+ let doesntHave skuId = state |> Array.exists ( fun x -> x.skuId = skuId) |> not
56+ match command with
57+ | Favorite ( date = date; skuIds = skuIds) ->
58+ [ for skuId in Seq.distinct skuIds do
59+ if doesntHave skuId then
60+ yield Events.Favorited { date = date; skuId = skuId } ]
61+ | Unfavorite skuId ->
62+ if doesntHave skuId then [] else
63+ [ Events.Unfavorited { skuId = skuId } ]
64+
65+ type Service internal ( log , resolve , maxAttempts ) =
66+
67+ let resolve ( Events.For id ) = Equinox.Stream< Events.Event, Fold.State>( log, resolve id, maxAttempts)
7368
7469 member __.Execute ( clientId , command ) =
75- execute clientId command
70+ let stream = resolve clientId
71+ stream.Transact( interpret command)
7672
77- member __ .Favorite( clientId , skus ) =
78- execute clientId ( Command.Favorite( DateTimeOffset.Now, skus))
73+ member x .Favorite( clientId , skus ) =
74+ x.Execute ( clientId, Command.Favorite ( DateTimeOffset.Now, skus))
7975
80- member __ .Unfavorite( clientId , skus ) =
81- execute clientId ( Command.Unfavorite skus)
76+ member x .Unfavorite( clientId , skus ) =
77+ x.Execute ( clientId, Command.Unfavorite skus)
8278
8379 member __.List clientId : Async < Events.Favorited []> =
84- read clientId
85-
80+ let stream = resolve clientId
81+ stream.Query id
82+
83+ let create log resolve = Service( log, resolve, maxAttempts = 3 )
84+
8685open Microsoft.Extensions .DependencyInjection
8786
8887type StreamResolver ( storage ) =
8988 member __.Resolve
90- ( codec : FsCodec.IUnionEncoder < 'event , byte [], _ >,
89+ ( codec : FsCodec.IUnionEncoder < 'event , byte [], _ >,
9190 fold : ( 'state -> 'event seq -> 'state ),
9291 initial : 'state ,
9392 snapshot : (( 'event -> bool ) * ( 'state -> 'event ))) =
@@ -99,22 +98,22 @@ type StreamResolver(storage) =
9998//#if eventStore
10099 | Storage.StorageConfig.Es ( gateway, caching, unfolds) ->
101100 let accessStrategy = if unfolds then Equinox.EventStore.AccessStrategy.RollingSnapshots snapshot |> Some else None
102- Equinox.EventStore.Resolver< 'event, 'state,_>( gateway, codec, fold, initial, ?caching = caching, ?access = accessStrategy) .Resolve
101+ Equinox.EventStore.Resolver< 'event, 'state, _>( gateway, codec, fold, initial, ?caching = caching, ?access = accessStrategy) .Resolve
103102//#endif
104103//#if cosmos
105104 | Storage.StorageConfig.Cosmos ( gateway, caching, unfolds, databaseId, containerId) ->
106105 let store = Equinox.Cosmos.Context( gateway, databaseId, containerId)
107106 let accessStrategy = if unfolds then Equinox.Cosmos.AccessStrategy.Snapshot snapshot else Equinox.Cosmos.AccessStrategy.Unoptimized
108- Equinox.Cosmos.Resolver< 'event, 'state,_>( store, codec, fold, initial, caching, accessStrategy) .Resolve
107+ Equinox.Cosmos.Resolver< 'event, 'state, _>( store, codec, fold, initial, caching, accessStrategy) .Resolve
109108//#endif
110109
111110type ServiceBuilder ( storageConfig , handlerLog ) =
112111 let resolver = StreamResolver( storageConfig)
113112
114113 member __.CreateFavoritesService () =
115- let fold , initial = Domain.Favorites.Folds .fold, Domain.Favorites.Folds .initial
116- let snapshot = Domain.Favorites.Folds .isOrigin, Domain.Favorites.Folds .compact
117- Domain.Favorites.Service ( handlerLog, resolver.Resolve( Domain.Favorites.Events.codec, fold, initial, snapshot))
114+ let fold , initial = Domain.Favorites.Fold .fold, Domain.Favorites.Fold .initial
115+ let snapshot = Domain.Favorites.Fold .isOrigin, Domain.Favorites.Fold .compact
116+ Domain.Favorites.create handlerLog ( resolver.Resolve( Domain.Favorites.Events.codec, fold, initial, snapshot))
118117
119118let register ( services : IServiceCollection , storageConfig , handlerLog ) =
120119 let regF ( factory : IServiceProvider -> 'T ) = services.AddSingleton< 'T>( fun ( sp : IServiceProvider ) -> factory sp) |> ignore
0 commit comments