2018-04-21 开胃学习.Net 系列 - Project Follow 5

2.1 User是在什么地方Input进去的?
2.2 如果where 筛选出的Area 匹配 个数为0,则报错,还是不清楚Area是什么怎么来了?
4.1 (Func<Post, Boolean>)(Post => Post.Owner.Name == User) 确认一下,是不是给func 的input是后面的post条件?
4.2 KWfilter 是怎么写出来的?为什么要返回boolean?怎么知道P.Title是什么?应该说怎么知道P是什么?
6.1 我有点看不懂Filters 的逻辑.(Filters.Count() == 0) 是什么判断
6.2 !F(p) 更不理解什么意思了
8.1 7 是什么单位
8.2 这个PostDataProvider 为什么要重写一次?因为一次是有指定的PostDuration?
10.0 Task<ICollection<PostDTO>>这个怎么理解?
10.1 所以还是需要问在SearchPostsBySpec 中,Where(Spec.CreateFilter())是个什么判断语句
10.2 PostDTO(s) 又是什么?
10.3 还是对一个spec createfilter() 不理解
10.4 SearchPosts 最后还是转化成 SearchbySpec。如何做到不矛盾?就是并集还是交集?
12.1 什么是PostDTO
12.2 什么是return new PostDTO(Post)
12.3 为什么有时候input有context有时候没有context
12.4 在方法EditPost 中 PostToEdit.Locale = l ?? throw new LocaleNotFoundException(); 是什么意思?
12.5 在方法EditPost 中 为什么没有修改area和category,如何自动修改的!?## PostSearchSpec 类

Validity Checks

  1. 方法
    1.1 方法UserValidityCheck: Check User是否在Context中
    1.2 方法AreaValidityCheck: Check Area是否在Context中
    1.3 方法LocaleValidityCheck
    1.4 方法 CategoryValidityCheck
    1.5 方法SubcategoryValidityCheck

  2. 问题
    2.1 User是在什么地方Input进去的?
    2.2 如果where 筛选出的Area 匹配 个数为0,则报错,还是不清楚Area是什么怎么来了?

        private async Task<Boolean> UserValidityCheck(DKHListContext Context)
        {
            if (User != null && await Context.Users.FindAsync(User) == null)
                throw new UserNotFoundException();
            return true;
        }

        private async Task<Boolean> AreaValidityCheck(DKHListContext Context)
        {
            if (Area != null && (await Context.Areas.Where(m => m.Name == Area).CountAsync() == 0))
                throw new AreaNotFoundException();
            return true;
        }

        private async Task<Boolean> LocaleValidityCheck(DKHListContext Context)
        {
            if (Locale != null)
            {
                var L = await Context.Locales.Where(m=>m.Name == Locale).FirstOrDefaultAsync();
                if (L == null || L.Area.Name != Area)
                    throw new LocaleNotFoundException();
            }
            return true;
        }
        private async Task<Boolean> CategoryValidityCheck(DKHListContext Context)
        {
            if (Category != null && await Context.Categories.Where(m=>m.Name == Category).CountAsync() == 0)
                throw new CategoryNotFoundException();
            return true;
        }

        private async Task<Boolean> SubcategoryValidityCheck(DKHListContext Context)
        {
            if (Subcategory != null)
            {
                var L = await Context.Subcategories.Where(m=>m.Name == Subcategory).FirstOrDefaultAsync();
                if (L == null || L.Category.Name != Category)
                    throw new SubcategoryNotFoundException();
            }
            return true;
        }





















  1. Filters
    3.1 写了一个函数UserFilter,返回boolean,如果user不是null,则func 返回一个boolean,且输入的post.owner.name == user的条件。
    3.2 写了一个函数AreaFilter,如果area不是null,返回所有等于目前Area的post
    3.3 写了一个函数LocaleFilter,如果locale不是null,返回所有等于目前Locale的post
    3.4 写了一个函数CategoryFilter,如果category不是null,返回所有等于目前Category的post
    3.5 写了一个函数SubCategoryFilter,如果subcategory不是null,返回所有等于目前subcategory的post
    3.6 写了一个函数KeywordFilter,返回的是boolean,如果title或者body里有keyword,都返回true
  1. 问题
    4.1 (Func<Post, Boolean>)(Post => Post.Owner.Name == User) 确认一下,是不是给func 的input是后面的post条件?
    4.2 KWfilter 是怎么写出来的?为什么要返回boolean?怎么知道P.Title是什么?应该说怎么知道P是什么?
        private Func<Post, Boolean> UserFilter()
        {
            return User == null ? null : (Func<Post, Boolean>)(Post => Post.Owner.Name == User);
        }
        private Func<Post, Boolean> AreaFilter()
        {
            return Area == null ? null : (Func<Post, Boolean>)(Post => Post.Locale.Area.Name == Area);
        }
        private Func<Post, Boolean> LocaleFilter()
        {
            return Locale == null ? null : (Func<Post, Boolean>)(Post => Post.Locale.Name == Locale);
        }
        private Func<Post, Boolean> CategoryFilter()
        {
            return Category == null ? null : (Func<Post, Boolean>)(Post => Post.Subcategory.Category.Name == Category);
        }
        private Func<Post, Boolean> SubcategoryFilter()
        {
            return Subcategory == null ? null : (Func<Post, Boolean>)(Post => Post.Subcategory.Name == Subcategory);
        }

        private Func<Post, Boolean> KeywordFilter()
        {
            var KWFilter = new Func<Post, Boolean>(P =>
            {
                foreach (var KW in Keywords)
                {
                    if (P.Title.Contains(KW))
                        return true;
                    else if (P.Body.Contains(KW))
                        return true;
                }
                return false;
            });

            if ((Keywords == null) || (Keywords.Count() == 0))
                return null;
            else
                return KWFilter;
                                                                
        }




















  1. CreateFilter
    5.1

  2. 问题
    6.1 我有点看不懂Filters 的逻辑.(Filters.Count() == 0) 是什么判断
    6.2 !F(p) 更不理解什么意思了

 public Func<Post, Boolean> CreateFilter()
        {
            var Filters = (new Func<Post, Boolean>[] {
                UserFilter(),
                AreaFilter(),
                LocaleFilter(),
                CategoryFilter(),
                SubcategoryFilter(),
                KeywordFilter()
            }).Where(f => f != null).ToList();

            if (Filters.Count() == 0)
                return (_ => true);
            else
                return (p => {
                    foreach (var F in Filters)
                    {
                        if (!F(p)) return false;
                    }
                    return true;
                             });
        }
        public async Task<Boolean> CheckSearchValidity(DKHListContext Context)
        {
            await UserValidityCheck(Context);
            await CategoryValidityCheck(Context);
            await SubcategoryValidityCheck(Context);
            await AreaValidityCheck(Context);
            await LocaleValidityCheck(Context);
            return true;
        }
    }





















PostDataProvider

  1. PostDataProvider
    7.1 默认的duration = 7
    7.2 _PostDuration
  1. 问题
    8.1 7 是什么单位
    8.2 这个PostDataProvider 为什么要重写一次?因为一次是有指定的PostDuration?
    public class PostDataProvider: BaseDataProvider
    {
        public static int DEFAULT_DURATION = 7;
        private int _PostDuration;
        public PostDataProvider(String UserID): base(UserID)
        {
            _PostDuration = DEFAULT_DURATION;
        }
        public PostDataProvider(String UserID, int PostDuration): base(UserID)
        {
            _PostDuration = PostDuration;
        }






















  1. SearchTasks
    9.1 方法 GetPostsByArea 按照area搜索地点
    9.2 方法 GetPostsByLocale 按照area搜索PostTDO
    9.3 GetPostsBySubcategoryGetPostsByCategoryGetPostsByUser
    9.4 SearchPosts 最后还是转化成 SearchbySpec
    9.5 SearchPosts
  1. 问题
    10.0 Task<ICollection<PostDTO>>这个怎么理解?
    10.1 所以还是需要问在SearchPostsBySpec 中,Where(Spec.CreateFilter())是个什么判断语句
    10.2 PostDTO(s) 又是什么?
    10.3 还是对一个spec createfilter() 不理解
    10.4 SearchPosts 最后还是转化成 SearchbySpec。如何做到不矛盾?就是并集还是交集?
        public async Task<ICollection<PostDTO>> GetPostsByArea(String Area)
        {
            var Spec = new PostSearchSpec
            {
                Area = Area
            };
            return await SearchPostsBySpec(Spec);
        }
        public async Task<ICollection<PostDTO>> GetPostsByLocale(String Area, String Locale)
        {
            var Spec = new PostSearchSpec
            {
                Area = Area,
                Locale = Locale
            };
            return await SearchPostsBySpec(Spec);
        }

        public async Task<ICollection<PostDTO>> GetPostsByCategory(String Category)
        {
            var Spec = new PostSearchSpec
            {
                Category = Category
            };
            return await SearchPostsBySpec(Spec);
        }
       public async Task<ICollection<PostDTO>> GetPostsBySubcategory(String Category, String Subcategory)
        {
            var Spec = new PostSearchSpec
            {
                Category = Category,
                Subcategory = Subcategory
            };
            return await SearchPostsBySpec(Spec);
        }
        public async Task<ICollection<PostDTO>> GetPostsByUser(String User)
        {
            var Spec = new PostSearchSpec
            {
                User = User
            };
            return await SearchPostsBySpec(Spec);
        }
        public async Task<ICollection<PostDTO>> SearchPosts(String User, String Area, String Locale, String Category, String Subcategory)
        {
            var Spec = new PostSearchSpec
            {
                User = User,
                Area = Area,
                Locale = Locale,
                Category = Category,
                Subcategory = Subcategory
            };
            return await SearchPostsBySpec(Spec);
        }
public async Task<ICollection<PostDTO>> SearchPosts(String User, String Area, String Locale, String Category, String Subcategory, ICollection<String> Keywords)
        {
            var Spec = new PostSearchSpec
            {
                User = User,
                Area = Area,
                Locale = Locale,
                Category = Category,
                Subcategory = Subcategory,
                Keywords = Keywords
            };
            return await SearchPostsBySpec(Spec);
        }
        private async Task<ICollection<PostDTO>> SearchPostsBySpec(PostSearchSpec Spec)
        {
            using (var Context = new DKHListContext())
            {
                await Spec.CheckSearchValidity(Context);
                return Context.Posts.Where(Spec.CreateFilter()).Select(s => new PostDTO(s)).ToList();
            }
        }





















  1. region EditTasks
    11.0 下面是方法 CreatePost
    11.1 检查是否已经注册过
    11.2 在context.Locales里找一遍和当前输入的Locale相同的第一个内容。如果是地方是null,或者hidden,直接报出 exception
    11.3 Subcategory做一样的事情
    11.4 new Post
    11.5 Add Post Context
    11.6 下面是方法 FindPostForChange
    11.7 找到PostToEdit 找出根据PostId, 不能是null,不能使owner.name != user.name,user也不能是Admin
    11.8 下面是方法EditPost
    11.9 修改Title,修改Body,修改Locale,修改Subcategory,修改

  2. 问题
    12.1 什么是PostDTO
    12.2 什么是return new PostDTO(Post)
    12.3 为什么有时候input有context有时候没有context
    12.4 在方法EditPostPostToEdit.Locale = l ?? throw new LocaleNotFoundException(); 是什么意思?
    12.5 在方法EditPost 中 为什么没有修改area和category,如何自动修改的!?

public async Task<PostDTO> CreatePost(String Title, String Body, String Locale, String Subcategory)
        {
            using (var Context = new DKHListContext())
            {
                var Owner = await CheckUserIsRegistered(Context);

                Locale L = await Context.Locales.Where(m => m.Name == Locale).FirstOrDefaultAsync();

                if (L == null || L.IsHidden)
                    throw new LocaleNotFoundException();

                Subcategory S = await Context.Subcategories.Where(m => m.Name == Subcategory).FirstOrDefaultAsync();

                if (S == null || S.IsHidden)
                    throw new SubcategoryNotFoundException();

                Post Post = new Post
                {
                    Timestamp = DateTime.Now,
                    Expiration = DateTime.Now.AddDays(_PostDuration),
                    Owner = Owner,
                    Title = Title,
                    Body = Body,
                    Locale = L,
                    Subcategory = S
                };
                Context.Posts.Add(Post);
                await Context.SaveChangesAsync();
                return new PostDTO(Post);
            }
        }
        private async Task<Post> FindPostForChanges(int PostId, DKHListContext Context)
        {
            Post PostToEdit = await Context.Posts.FindAsync(PostId);

            if (PostToEdit == null)
                throw new PostNotFoundException();

            var User = await CheckUserIsRegistered(Context);

            if (PostToEdit.Owner.Name != User.Name && !User.IsAdmin)
                throw new AttemptedUnauthorizedAdminActionException();

            return PostToEdit;
        }
        public async Task<PostDTO> EditPost(int PostId, String Title, String Body, String Locale, String Subcategory) {
            using (var Context = new DKHListContext())
            {
                var PostToEdit = await FindPostForChanges(PostId, Context);

                if (Title != null)
                    PostToEdit.Title = Body;

                if (Body != null)
                    PostToEdit.Body = Body;
                
                if (Locale != null)
                {
                    Locale l = await Context.Locales.FindAsync(Locale);
                    PostToEdit.Locale = l ?? throw new LocaleNotFoundException();
                }

                if (Subcategory != null)
                {
                    Subcategory c = await Context.Subcategories.FindAsync(Subcategory);
                    PostToEdit.Subcategory = c ?? throw new SubcategoryNotFoundException();
                }

                await Context.SaveChangesAsync();
                return new PostDTO(PostToEdit);
            }
        }
        public async Task<Boolean> DeletePost(int PostId)
        {
            using (var Context = new DKHListContext())
            {
                var PostToDelete = await FindPostForChanges(PostId, Context);

                Context.Posts.Remove(PostToDelete);
                await Context.Responses.Where(R => R.Post.Id == PostToDelete.Id).ForEachAsync(R => Context.Responses.Remove(R));

                return true;
            }
        }
        #endregion




















Exception

这个环节不太重要

using System;
using System.Collections.Generic;
using System.Text;

namespace BusinessLayer.DataProvider
{
    #region AdminExceptions
    public class AttemptedUnauthorizedAdminActionException : Exception { }
    #endregion

    #region GeographyDataExceptions
    public class LocaleNotFoundException : Exception { }
    public class LocaleNotProvidedException : Exception { }
    public class AreaNotFoundException : Exception { }
    public class DuplicateLocaleException : Exception { }
    public class DuplicateAreaException : Exception { }
    #endregion

    #region CategorizationDataExceptions
    public class CategoryNotFoundException : Exception { }
    public class SubcategoryNotFoundException : Exception { }
    public class SubcategoryNotProvidedException : Exception { }
    public class DuplicateCategoryException : Exception { }
    public class DuplicateSubcategoryException : Exception { }
    #endregion

    #region User Exceptions
    public class UserNotFoundException : Exception { }
    public class AnonymousNotAllowedException : Exception { }
    public class DuplicateUserException : Exception { }
    public class WrongPasswordException : Exception { }
    #endregion

    #region Post Exceptions
    public class PostNotFoundException : Exception { }
    #endregion
}

CreateFilterdi't

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335