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()); }
public SagaManager(ISagaFinderFactory factory) { _factory = factory; }