Guest User

Untitled

a guest
Aug 16th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.94 KB | None | 0 0
  1. public class FrontLoadContext<TActivity>
  2. {
  3. public void Plan(DateTime projectStart)
  4. {
  5. //Create the wrapped object that will play the role of project
  6. var project = _projectCreator.Create();
  7. project.FrontloadFrom(projectStart);
  8. }
  9.  
  10. internal static void FrontloadFrom(IActivityContract activity, DateTime projectStart)
  11. {
  12. IActivityContract predecessor =
  13. ((IActivityRole) activity).Predecessors.Cast<IActivityContract>().OrderByDescending(a => a.End).
  14. FirstOrDefault();
  15. activity.Start = predecessor == null ? projectStart : predecessor.End;
  16. }
  17.  
  18. internal static IEnumerable<IActivityRole> GetPredecessors(IActivityContract activity)
  19. {
  20. return from act in activity.Dependencies
  21. select DynamicCreator<IActivityContract, IActivityRole>.GetCreator(act).Create();
  22. }
  23.  
  24. internal static void FrontloadFrom(IProjectContract project, DateTime projectStart)
  25. {
  26. //select an activity which has not been planned
  27. IEnumerable<IActivityRole> activities = from task in project.Tasks
  28. let act =
  29. DynamicCreator<IActivityContract, IActivityRole>.GetCreator(
  30. task).Create()
  31. where !act.Planned && act.Predecessors.All(a => a.Planned)
  32. select act;
  33. while (activities.All(a => a.Planned))
  34. {
  35. foreach (var activity in activities)
  36. {
  37. activity.FrontloadFrom(projectStart);
  38. }
  39. }
  40. }
  41.  
  42. internal interface IActivityContract
  43. {
  44. IEnumerable<TActivity> Dependencies { get; }
  45. DateTime End { get; }
  46. DateTime Start { get; set; }
  47. bool HasBeenPlanned { get; }
  48. }
  49.  
  50. public interface IActivityRole
  51. {
  52. IEnumerable<IActivityRole> Predecessors { get; }
  53. bool Planned { get; }
  54. void FrontloadFrom(DateTime projectStart);
  55. }
  56.  
  57. internal interface IProjectContract
  58. {
  59. List<TaskData> Tasks { get; }
  60. }
  61.  
  62.  
  63. internal interface IProjectRole
  64. {
  65. void FrontloadFrom(DateTime projectStart);
  66. }
  67.  
  68. private readonly DynamicCreator<IProjectContract, IProjectRole>.ICreator _projectCreator;
  69.  
  70. public FrontLoadContext(ProjectData project)
  71. {
  72. //Create the internal representation of the acting objects making sure they adhere to the given contracts
  73. _projectCreator = DynamicCreator<IProjectContract, IProjectRole>.GetCreator(project);
  74.  
  75. //Add role methods to the project acting objects
  76. if (!_projectCreator.IsFinalized)
  77. {
  78. _projectCreator.Add<DateTime>(proj => proj.FrontloadFrom(default(DateTime)),
  79. (p, start) => FrontloadFrom(p, start));
  80. }
  81.  
  82. //Add role methods to the activity acting objects
  83. DynamicCreator<IActivityContract, IActivityRole>.ICreator activityCreator =
  84. DynamicCreator<IActivityContract, IActivityRole>.GetCreator<TActivity>();
  85. if (!activityCreator.IsFinalized)
  86. {
  87. activityCreator.Add<DateTime>(a => a.FrontloadFrom(default(DateTime)),
  88. (a, start) => FrontloadFrom(a, start));
  89. activityCreator.Add(a => a.Predecessors, a => GetPredecessors(a));
  90. activityCreator.Add(a => a.Planned, a => a.HasBeenPlanned);
  91. activityCreator.Create();
  92. }
  93. }
  94. }
Add Comment
Please, Sign In to add comment