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 方法UserValidityCheck
: Check User是否在Context中
1.2 方法AreaValidityCheck
: Check Area是否在Context中
1.3 方法LocaleValidityCheck
1.4 方法CategoryValidityCheck
1.5 方法SubcategoryValidityCheck
问题
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;
}
- 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
- 问题
4.1(Func<Post, Boolean>)(Post => Post.Owner.Name == User)
确认一下,是不是给func 的input是后面的post条件?
4.2KWfilter
是怎么写出来的?为什么要返回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;
}
CreateFilter
5.1问题
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
- 类
PostDataProvider
7.1 默认的duration = 7
7.2 _PostDuration
- 问题
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;
}
- SearchTasks
9.1 方法GetPostsByArea
按照area搜索地点
9.2 方法GetPostsByLocale
按照area搜索PostTDO
9.3GetPostsBySubcategory
,GetPostsByCategory
,GetPostsByUser
9.4SearchPosts
最后还是转化成 SearchbySpec
9.5SearchPosts
- 问题
10.0Task<ICollection<PostDTO>>
这个怎么理解?
10.1 所以还是需要问在SearchPostsBySpec
中,Where(Spec.CreateFilter())
是个什么判断语句
10.2 PostDTO(s) 又是什么?
10.3 还是对一个speccreatefilter()
不理解
10.4SearchPosts
最后还是转化成 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();
}
}
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,修改问题
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,如何自动修改的!?
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