public void Initialize() { _cacheProvider = Substitute.For <ICacheProvider>(); _cacheProvider.GetOrAdd(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <Func <GraphNode> >()) .Returns(ci => ((Func <GraphNode>)ci[2]).Invoke()); _register = new AggregateRegister(_cacheProvider); }
/// <summary> /// Load an aggregate type from the database (including all related entities) /// </summary> /// <typeparam name="T">Type of the entity</typeparam> /// <param name="context">DbContext</param> /// <param name="keyPredicate">The predicate used to find the aggregate by key</param> /// <param name="queryMode">Load all objects at once, or perform multiple queries</param> /// <returns>The aggregate loaded from the database</returns> public static T LoadAggregate <T>(this DbContext context, Expression <Func <T, bool> > keyPredicate, QueryMode queryMode = QueryMode.SingleQuery) where T : class { var entityManager = new EntityManager(context); var graph = new AggregateRegister(new CacheProvider()).GetEntityGraph <T>(); var queryLoader = new QueryLoader(context, entityManager); if (graph == null) { throw new NotSupportedException("Type: '" + typeof(T).FullName + "' is not a known aggregate"); } var includeStrings = graph.GetIncludeStrings(entityManager); return(queryLoader.LoadEntity(keyPredicate, includeStrings, queryMode)); }
// other methods are convenience wrappers around this. private static T UpdateGraph <T>(this DbContext context, T entity, T persisted, Expression <Func <IUpdateConfiguration <T>, object> > mapping, string mappingScheme, UpdateParams updateParams) where T : class { if (entity == null) { throw new ArgumentNullException("entity"); } var entityManager = new EntityManager(context); var queryLoader = new QueryLoader(context, entityManager); var register = new AggregateRegister(new CacheProvider()); var root = GetRootNode(mapping, mappingScheme, register); var differ = new GraphDiffer <T>(context, queryLoader, entityManager, root); var queryMode = updateParams != null ? updateParams.QueryMode : QueryMode.SingleQuery; return(differ.Merge(entity, persisted, queryMode)); }
private static GraphNode GetRootNode <T>(Expression <Func <IUpdateConfiguration <T>, object> > mapping, string mappingScheme, AggregateRegister register) where T : class { GraphNode root; if (mapping != null) { // mapping configuration root = register.GetEntityGraph(mapping); } else if (mappingScheme != null) { // names scheme root = register.GetEntityGraph <T>(mappingScheme); } else { // attributes or null root = register.GetEntityGraph <T>(); } return(root); }