xxx: рдЬрдм рдЖрдк рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рджреВрд╕рд░рд╛, рдЬрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЖрдзрд╛-рдореАрдЯрд░ xml рдХреЙрдиреНрдлрд┐рдЧ рдХреЗ рд╕рд╛рде рдЧреЛрдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рдЖрдк рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХреЗ рд▓рд┐рдП рдореИрдкрд┐рдВрдЧ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рдЖрдк рд╡реЗрдм рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЖрдк рдЖрдзрд╛рд░ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ
xxx: рдЬреИрд╕реЗ рдЖрдк рд╣реИрд▓реЛ рджреБрдирд┐рдпрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреЛ рд╕рдкреНрддрд╛рд╣ рдмреАрдд рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ рд╣рд░ рдХреЛрдИ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЫреЛрдЯреЗ рд╡реНрдпрд╡рд╕рд╛рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдЦрд╛рдВрдХрди рдкреНрд░рдгрд╛рд▓реА рд╣реИ
ibash.org.ru
рдХрдИ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ, рдореИрдВ рдПрдХ рд╕рд░рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХрд╛ рдЙрджрд╛рд╣рд░рдг, рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЛрдХрдкреНрд░рд┐рдп рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХреЗ рд▓рд┐рдП рджреГрдврд╝рддрд╛ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдбреЛрдореЗрди рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░рддреЛрдВ рдХреЛ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ -
рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛрдб рдкреНрд░рдердо рдФрд░
рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ NHibernate ред рдпрджрд┐ рдЖрдкрдиреЗ рдбреАрдбреАрдбреА рдХреЗ рддреАрди рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реБрдирд╛ рд╣реИ рдФрд░ рдЖрдк рдореБрдЭреЗ рддреАрди рдореЗрдВ рднреА рдирд╣реАрдВ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдкрддреНрд░ - рдХреГрдкрдпрд╛, рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗред

рджрд░рдЕрд╕рд▓, рдбреАрдбреАрдбреА (рдбреЛрдореЗрди-рд╕рдВрдЪрд╛рд▓рд┐рдд рд╡рд┐рдХрд╛рд╕) рдХрд╛ рдмрд╣реБрдд рдирд╛рдо рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рджреНрд╡рд╛рд░рд╛ "рд╕рдВрдЪрд╛рд▓рд┐рдд" рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдФрд░ рдХреБрдЫ рдФрд░ рджреНрд╡рд╛рд░рд╛ред рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЖрджрд░реНрд╢ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рдирд╣реАрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдбреЛрдореЗрди рдХреЛ рдЕрдкрдиреА рдХреНрд╖рдорддрд╛рдУрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ - рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдо рдХрд░реЗрдВрдЧреЗ: рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдЬрд┐рд╕рдХреЗ рддрд╣рдд рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред
рдбреЛрдореЗрди рдкрд░рдд
рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдкрдиреЗ рд╕рдордп рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ TODO рдЪрд╛рджрд░реЗрдВ рдмрдирд╛рдирд╛ рд╣реИ (рд╡рд┐рд╢рд┐рд╖реНрдЯ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛)ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИрдВ (рд╣рд╛рдБ, рд╡рд╣реА рдЖрдЙрдЯрд▓реБрдХ) - рд╣рдо рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЕрдкрдирд╛рдПрдВрдЧреЗред рдЗрд╕ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реБрдП, рдХрдИ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рдХрд╛рд░реНрдп
- рдЕрдирд┐рд╢реНрдЪрд┐рдд рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде (рдирдИ рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдмрдЪрд╛рдПрдВ)
- рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд┐рдерд┐ рдкрд░
- рдкреВрд░реЗ рджрд┐рди (рдкреВрд░реЗ рджрд┐рди рдзреВрдореНрд░рдкрд╛рди рди рдХрд░реЗрдВред PS: рдореИрдВ рдзреВрдореНрд░рдкрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ :-))
- рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдордп рдХреЗ рд▓рд┐рдП
- рдЫреЛрдЯреЗ рдЙрдкрдХреЗрдВрджреНрд░реЛрдВ рдХреЗ рд╕рд╛рде, рдФрд░ рдЗрд╕реЗ рдкреВрд░рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╕рднреА рдЙрдкрдХреЗрдВрджреНрд░ рдкреВрд░реЗ рд╣реЛ рдЬрд╛рдПрдВ (рджрд┐рди рдХреЗ рджреМрд░рд╛рди рдЖрдВрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реНрдЬ рдХрд░рдирд╛)
- рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╢реНрд░реЗрдгреА (рдкрджрд╛рдиреБрдХреНрд░рдо) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдм рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдРрд╕рд╛ рдЧреНрд░рд╛рдлрд╝ рдорд┐рд▓рддрд╛ рд╣реИ (рдХреЛрдбрдкреЙрдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж):

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдирд╛рдо рд╕рдмрд╕реЗ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реИрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ "рдорд▓реНрдЯреАрдкрд▓рд▓реАрдЯрд╕реНрдХ", рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдХрднреА рдирд╣реАрдВ рд╣реБрдЖ)ред рдпрд╣ рдЧреНрд░рд╛рдл рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдХреНрд░рд┐рдп рд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрдкреВрд░реНрдг рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реВрдЪреА рдЗрд╕ рдирд┐рд░реАрдХреНрд╖рдг рдХреЛ рд╕рд╣реА рдХрд░реЗрдЧреА:
рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ
рд╕рдореБрдЪреНрдЪрдпTaskBasepublic abstract class TaskBase : Entity { protected TaskBase(string summary, string desc) { ChangeSummary(summary); ChangeDescription(desc); } protected TaskBase() { } public string Summary { get; private set; } public string Description { get; private set; } public bool IsComplete { get; protected set; } public virtual void Complete() { if (IsComplete) throw new InvalidOperationException("Task is already completed"); IsComplete = true; } public void ChangeSummary(string summary) { Summary = summary; } public void ChangeDescription(string description) { Description = description; } }
IndeterminateTask public class IndeterminateTask : TaskBase { public IndeterminateTask(string summary, string desc, Category category) : base(summary, desc) { Category = category; } protected IndeterminateTask() { } public Category Category { get; private set; } public void ChangeCategory(Category category) { Category = category; } }
DailyTask public abstract class DailyTask : TaskBase { protected DailyTask(string summary, string desc, DateTime setupDay) : base(summary, desc) { DueToDate = setupDay; } protected DailyTask() { } public DateTime DueToDate { get; private set; } public void ChangeDueDate(DateTime dueToDate) { DueToDate = dueToDate; } }
SingleDailyTask public class SingleDailyTask : DailyTask { public SingleDailyTask(string summary, string desc, DateTime setupDay, bool isWholeDay) : base(summary, desc, setupDay) { IsWholeDay = isWholeDay; } protected SingleDailyTask() { } public bool IsWholeDay { get; private set; } public void ChangeIsWholeDay(bool isWholeDay) { IsWholeDay = isWholeDay; if (IsWholeDay) { ChangeDueDate(DueToDate.Date); } } }
MultipleDailyTask public class MultipleDailyTask : DailyTask { public MultipleDailyTask(string summary, string desc, DateTime setupDay, IEnumerable<DateTime> dueToDates) : base(summary, desc, setupDay) { ChangeSubtasks(dueToDates.ToList()); } protected MultipleDailyTask() { } public virtual ICollection<Subtask> Subtasks { get; set; } public override void Complete() { throw new NotSupportedException(); } public void CompleteSubtask(DateTime subtaskDueDate) { if (Subtasks == null) throw new InvalidOperationException(); var subtask = Subtasks.FirstOrDefault(i => i.DueTime == subtaskDueDate); if (subtask == null) throw new InvalidOperationException(); subtask.Complete(DateTime.Now); var hasUncompleted = Subtasks.Any(i => i.CompletedAt == null); if (!hasUncompleted) { base.Complete(); } } public bool HasUncompletedSubtasks { get { return Subtasks != null && Subtasks.Any(i => i.CompletedAt == null); } } public int CompletionPercentage { get { var totalSubtasks = Subtasks.Count; var completedSubtasks = Subtasks.Count(i => i.CompletedAt.HasValue); if (totalSubtasks == 0 || totalSubtasks == completedSubtasks) return 100; return (int) Math.Round(completedSubtasks * 100.0 / totalSubtasks, 0); } } public void ChangeSubtasks(ICollection<DateTime> subtasksDueToDates) { var times = subtasksDueToDates.Select(i => i.ToTime()); if (Subtasks == null) { Subtasks = times.Select(i => new Subtask(i)).ToList(); return; } var oldSubtasks = Subtasks.ToList(); var newSubtasks = times.ToList();
рдЙрдкрдХрд╛рд░реНрдп public class Subtask : Entity { public DateTime DueTime { get; private set; } public DateTime? CompletedAt { get; private set; } public Subtask(DateTime dueTime) { DueTime = dueTime; } public void Complete(DateTime completedAt) { CompletedAt = completedAt; } protected Subtask() { } }
рд╢реНрд░реЗрдгреА public class Category : Entity { public Category(string name, Category parentCategory) { Name = name; ParentCategory = parentCategory; } protected Category() { } public string Name { get; private set; } public virtual ICollection<IndeterminateTask> Tasks { get; set; } public virtual ICollection<Category> ChildrenCategories { get; set; } public virtual Category ParentCategory { get; private set; } public void ChangeName(string name) { Name = name; } public void ChangeParentCategory(Category category) { ParentCategory = category; } }
рдЦрдЬрд╛рдиреЗ public interface IRepository { } public interface ITaskRepository : IRepository { IEnumerable<TaskBase> AllMatching(Specification<TaskBase> specification); void Add(TaskBase taskBase); void Remove(TaskBase taskBase); TaskBase Get(Guid taskId); } public interface ICategoryRepository : IRepository { IEnumerable<Category> All(); void Add(Category category); void Remove(Category category); Category Get(Guid id); }
рд╡рд┐рдирд┐рд░реНрджреЗрд╢ public static class CategorySpecifications { public static Specification<Category> Name(string name) { return new DirectSpecification<Category>(category => category.Name == name); } } public static class TaskSpecifications { public static Specification<TaskBase> CompletedTask() { return new DirectSpecification<TaskBase>(task => task.IsComplete); } public static Specification<TaskBase> DueToDateRange(DateTime startDateIncl, DateTime endDateIncl) { var spec = IsDailyTask(); spec &= new DirectSpecification<TaskBase>(task => ((DailyTask)task).DueToDate >= startDateIncl && ((DailyTask)task).DueToDate <= endDateIncl); return spec; } public static Specification<TaskBase> IsIndeterminatedTask() { return new DirectSpecification<TaskBase>(task => task is IndeterminateTask); } public static Specification<TaskBase> IsDailyTask() { return new DirectSpecification<TaskBase>(task => task is DailyTask); } }
рдЖрдк рдореЗрд░рд╛ рдПрдХ рдФрд░
рд▓реЗрдЦ рдореЗрдВ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВ - рд╡реНрдпрд╛рдкрд╛рд░рд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╡рд┐рд░рд╛рд╕рдд (рдХреБрдЫ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдЕрдкрдирд╛ рд╕рдВрдмрдВрдз рд╣реИ), рдЖрдкрд╕реА рд╕рдВрдмрдВрдз, рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо (рдЦреБрдж рд╕реЗ рд╕рдВрдмрдВрдз) - рдпрд╣ рд╕рдм (рдФрд░ рдХрд╛рд░рдг) рдХреБрдЫ рдЦреБрдЬрд▓реА рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЬрдЧрд╣ред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ IRepository рд░рд┐рдХреНрдд рд╣реИ, рдФрд░ AllMatching, GetById, Delete, Add, рдЖрджрд┐ рдЬреИрд╕реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реАрдХреЛрдВ рд╕реЗ рднрд░рд╛ рдирд╣реАрдВ рд╣реИред - рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред рдЬреЗрдиреЗрд░рд┐рдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдмреБрд░рд╛рдИ рдХреНрдпреЛрдВ рд╣реИ,
рдпрд╣рд╛рдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рдЖрд╡реЗрджрди рдФрд░ рд╡рд┐рддрд░рд┐рдд рд╕реЗрд╡рд╛ рдкрд░рддреЗрдВ
рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЗрдпрд░ рдХреЛ рджреЛ рдЕрд╕реЗрдВрдмрд▓рд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдПрдХ рдбреАрдЯреАрдУ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рджреВрд╕рд░рд╛ рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдбреАрдЯреАрдУ <-> рдПрдВрдЯрд┐рдЯреА рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рд▓рд┐рдП, рдФрд░ рд╡рд┐рддрд░рд┐рдд рд╕рд░реНрд╡рд┐рд╕реЗрдЬ рд▓реЗрдпрд░ рдПрдХ рд╡реЗрдм рдЦрд╛рд▓реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ WCF рд╕реЗрд╡рд╛ (рдореБрдЦрд░) рд╣реИ рдЬреЛ рдмрд╕ рд╕реЗрд╡рд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдПрдХ рд╣реА DTO (WCF DataContractSerializer рдХрд╛ рд▓рд╛рдн рдХрд┐рд╕реА рднреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡реЗрджрди рд╕реНрддрд░
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рджреЛ рд╕реЗрд╡рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рдПрдХ рдХрд╛рд░реНрдп рдХреЛ рд╣рдЯрд╛рдирд╛ рдФрд░ рдЪрд╛рд▓реВ рдорд╛рд╣ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрд╛рд░реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред
рдЖрд╡реЗрджрди рдкрд░рдд:
public void RemoveTask(Guid taskId) { using (var unitOfWork = UnitOfWorkFactory.Create()) { var task = _tasksRepository.Get(taskId); if (task == null) throw new Exception(); _tasksRepository.Remove(task); unitOfWork.Commit(); } } public IEnumerable<DailyTaskDTO> GetMonthTasks() { var nowDate = DateTime.Now; var monthStartDate = new DateTime(nowDate.Year, nowDate.Month, 1); var monthEndDate = new DateTime(nowDate.Year, nowDate.Month, DateTime.DaysInMonth(nowDate.Year, nowDate.Month)); var specification = TaskSpecifications.DueToInDateRange(monthStartDate, monthEndDate); var tasks = _tasksRepository.AllMatching(specification).ToList(); return tasks.OfType<DailyTask>().ProjectedAsCollection<DailyTaskDTO>().ToArray(); }
рдФрд░ рд╡рд┐рддрд░рд┐рдд рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рд╕реНрдиреИрдХреНрд╕
public void RemoveTask(Guid taskId) { using (ILifetimeScope container = BeginLifetimeScope()) { container.Resolve<TaskService>().RemoveTask(taskId); } } public List<DailyTaskDTO> GetMonthTasks() { using (ILifetimeScope container = BeginLifetimeScope()) { return container.Resolve<TaskService>().GetMonthTasks().ToList(); } }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░рдд рд╕рднреА рдЧрдВрджреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛, рд▓реЗрдирджреЗрди рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рдФрд░ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдбреАрдЯреАрдУ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ (рдЕрджреНрднреБрдд рдЙрдкрдХрд░рдг рдСрдЯреЛрдореИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред рдбрд┐рд╕реНрдЯреНрд░реАрдмреНрдпреВрдЯреЗрдб рд╕рд░реНрд╡рд┐рд╕реЗрд╕ рдореЗрдВ рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рд╕реЙрдк рдореЗрдВ рд░реИрдкрд┐рдВрдЧ рд╕рд░реНрд╡рд┐рд╕ рдореЗрдердбреНрд╕ рд╣рдореЗрдВ рд╕рд┐рдВрдЧрд▓ рдпреВрдирд┐рдЯрдСрдлрд╡реЙрд░реНрдХ (рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рд╕реНрдХреЛрдк рдХреЗ рдкреНрд░рддрд┐ рд╕рд┐рдВрдЧрд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕) рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЙрдмрд╛рдК рдкрд╛рда рдФрд░ рдкрд╛рдиреА - рдпреЗ
рд╕реНрд░реЛрдд рд╣реИрдВ ред
рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ
рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рдмрддрд╛рдирд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдбреАрдбреАрдбреА рдХреНрдпрд╛ рд╣реИ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рдХрд┐рддрд╛рдмреЗрдВ рд╣реИрдВ, рдФрд░ рдпрд╣ рд▓реЗрдЦ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реИ - рдореИрдВ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рд▓реЗрдЦ рд╕рд┐рд░реНрдл рдПрдХ рдкрд░рд┐рдЪрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрд╛рд░реА рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ...