예제 #1
0
        public SagaRegistry(Saga[] sagas, ISagaFinderFactory finder)
        {
            _finder = finder;
            var m = from s in sagas
                    from i in s.GetType().GetInterfaces()
                    where i.IsGenericType
                    let generic = i.GetGenericTypeDefinition()
                                  where generic == typeof(ISagaAction <>)
                                  let a = new { MessageType = i.GetGenericArguments()[0], Manager = CreateManagerForSaga(s) }
            let param = Expression.Parameter(typeof(object), "event")
                        let func = Expression.Lambda <Action <object> >(
                Expression.Call(
                    Expression.Constant(a.Manager), "ProcessMessage", new[] { a.MessageType },
                    Expression.Convert(param, a.MessageType)), param)
                                   group func.Compile() by a.MessageType
                                   into g
                                   select g;

            _interestedManagers = m.ToDictionary(k => k.Key, v => v.ToList());
        }
예제 #2
0
 public SagaManager(ISagaFinderFactory factory)
 {
     _factory = factory;
 }