美文网首页
2018-04-21 开胃学习.Net 系列 - Project

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

作者: Kaiweio | 来源:发表于2018-04-22 14:29 被阅读0次

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

相关文章

网友评论

      本文标题:2018-04-21 开胃学习.Net 系列 - Project

      本文链接:https://www.haomeiwen.com/subject/gqiqlftx.html