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);
        }
예제 #2
0
        /// <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));
        }
예제 #3
0
        // 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));
        }
예제 #4
0
        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);
        }