private void BuildJoiner <TCompatibleRequest>(CrudRequestConfig <TCompatibleRequest> config)
        {
            if (EntityKey == null || RequestItemKey == null)
            {
                return;
            }

            var joinInfo = typeof(EnumerableExtensions)
                           .GetMethod("FullOuterJoin", BindingFlags.Static | BindingFlags.NonPublic)
                           .MakeGenericMethod(typeof(object), typeof(TEntity), RequestItemKey.KeyType);

            var makeKeySelectorInfo = typeof(CrudBulkRequestEntityConfigBuilder <TRequest, TItem, TEntity>)
                                      .GetMethod("MakeKeySelector", BindingFlags.Static | BindingFlags.NonPublic);

            var itemsParam    = Expression.Parameter(typeof(IEnumerable <object>));
            var entitiesParam = Expression.Parameter(typeof(IEnumerable <TEntity>));

            var makeLeftKeySelector = makeKeySelectorInfo.MakeGenericMethod(typeof(object), RequestItemKey.KeyType);
            var convLeftKeyParam    = Expression.Parameter(typeof(object));
            var convLeftKeyCall     = Expression.Invoke(
                RequestItemKey.KeyExpression,
                Expression.Convert(convLeftKeyParam, typeof(TItem)));
            var leftKeyExpr = Expression.Call(makeLeftKeySelector, Expression.Lambda(convLeftKeyCall, convLeftKeyParam));

            var makeRightKeySelector = makeKeySelectorInfo.MakeGenericMethod(typeof(TEntity), EntityKey.KeyType);
            var rightKeyExpr         = Expression.Call(makeRightKeySelector, Expression.Constant(EntityKey.KeyExpression));

            var joinExpr   = Expression.Call(joinInfo, itemsParam, entitiesParam, leftKeyExpr, rightKeyExpr);
            var lambdaExpr = Expression.Lambda <Func <IEnumerable <object>, IEnumerable <TEntity>, IEnumerable <Tuple <object, TEntity> > > >(
                joinExpr, itemsParam, entitiesParam);

            config.SetEntityJoiner(lambdaExpr.Compile());
        }
        public override void Build <TCompatibleRequest>(CrudRequestConfig <TCompatibleRequest> config)
        {
            base.Build(config);

            if (Selector == null)
            {
                DefaultSelector(config);
            }
        }
コード例 #3
0
        public void Test_RequestWithoutProfile_FindsDefaultConfig()
        {
            var defaultConfig    = new CrudRequestConfig <CreateUserWithResponseRequest>();
            var createUserConfig = _profileManager.GetRequestConfigFor <CreateUserWithResponseRequest>();

            Assert.IsNotNull(defaultConfig);
            Assert.IsNotNull(createUserConfig);
            Assert.AreEqual(defaultConfig.GetType(), createUserConfig.GetType());
        }
        private void DefaultSelector <TCompatibleRequest>(
            CrudRequestConfig <TCompatibleRequest> config)
        {
            var requestKey = config.GetRequestKey();
            var entityKey  = config.GetKeyFor <TEntity>();

            if (requestKey != null && entityKey != null)
            {
                var builder = new SelectorBuilder <TRequest, TEntity>();
                config.SetEntitySelector <TEntity>(builder.Single(requestKey, entityKey));
            }
        }
        private void DefaultSelector <TCompatibleRequest>(
            CrudRequestConfig <TCompatibleRequest> config)
        {
            var itemKey   = config.GetRequestKey();
            var entityKey = config.GetKeyFor <TEntity>();

            if (itemKey != null && entityKey != null)
            {
                var builder = new SelectorBuilder <TRequest, TEntity>();
                config.SetEntitySelector <TEntity>(builder.Collection(_getRequestItems, entityKey, itemKey));
            }
        }
        public override void Build <TCompatibleRequest>(CrudRequestConfig <TCompatibleRequest> config)
        {
            if (_getRequestItems == null)
            {
                var message =
                    $"No request item source has been defined for '{typeof(TRequest)}'." +
                    $"Define item source by calling `{nameof(WithRequestItems)}` in the request's profile.";

                throw new BadCrudConfigurationException(message);
            }

            base.Build(config);

            if (Selector == null)
            {
                DefaultSelector(config);
            }

            BuildJoiner(config);

            config.SetItemHooksFor <TEntity>(_itemHooks);
        }
        public virtual void Build <TCompatibleRequest>(CrudRequestConfig <TCompatibleRequest> config)
        {
            if (OptionsConfig != null)
            {
                config.SetOptionsFor <TEntity>(OptionsConfig);
            }

            if (ErrorHandlerFactory != null)
            {
                config.ErrorConfig.SetErrorHandlerFor(typeof(TEntity), ErrorHandlerFactory);
            }

            config.SetEntityDefault(DefaultValue);

            if (RequestItemKey != null)
            {
                config.SetRequestKey(RequestItemKey);
            }

            if (EntityKey != null)
            {
                config.SetEntityKey <TEntity>(EntityKey);
            }

            if (RequestItemSource != null)
            {
                config.SetEntityRequestItemSource <TEntity>(RequestItemSource);
            }

            if (Selector != null)
            {
                config.SetEntitySelector <TEntity>(Selector);
            }

            if (CreateEntity != null)
            {
                config.SetEntityCreator(CreateEntity);
            }

            if (UpdateEntity != null)
            {
                config.SetEntityUpdator(UpdateEntity);
            }

            if (CreateResult != null)
            {
                config.SetEntityResultCreator(CreateResult);
            }

            if (Sorter != null)
            {
                config.SetEntitySorter <TEntity>(Sorter);
            }

            if (_filters.Count > 0)
            {
                config.SetEntityFilters <TEntity>(_filters);
            }

            config.SetEntityHooksFor <TEntity>(EntityHooks);
        }