0

假设我有一个简单的 todolist:

interface ITodoList
{
  ITodoItem Create(title);
  IEnumerable<ITodoItem> Items {get;}
}
interface ITodoITem
{
    void StartTrackTime();
    void StopTrackTime();
}

现在我想强制执行,以便一次只跟踪一项(每个用户)的时间。

我是否应该创建一个这样的域ItemTimeTrackingStarted事件StartTrackTime。该事件将由 aITodoService检查当前用户是否有任何其他时间跟踪项目(并停止它们)。还是有更好的方法?

4

3 回答 3

1

IMO我会这样做,我不知道上下文的所有细节,但是对于这个特定的功能来说

 public interface ITrackTime
 {

    void StartTrackTime();
    void StopTrackTime();
 }
 public interface ITodoItem
 {
    int Id {get;}  
    //other stuff
 }

 public TodoItem:ITodoITem, ITrackTime {}

 public class TodoList:ITodoList,ITrackItem
 {
    ITodoItem Create(title)
    { 
       //create item and add it to collection 
     }
      TodoItem _currentlyTracking;

     void StartTrackTime(int itemId)
     {

        if (_currentlyTracking == null)
        {
           // getItem and call method for item ..
          item.StartTrackTime();
          _currentlyTracking=item;
         }
        else{
           //get item and check to see if it is the same id
           //throw exception if it is not, ignore it if it is
          }
      }
 }

 var list = new TodoList();
 ITodoItem item= list.Create("titel");
 list.StartTrackingTime(item.Id);
 list.StartTrackingTime(otherId); //should throw or whatever handling

一切都包含在 AR (TodoList) 中。再一次,这是一个粗略的草案,因为我并不完全了解上下文和领域。

于 2012-04-20T12:32:15.220 回答
1

好吧,如果您在项目之间存在依赖关系,在这种情况下是检查,我的建议是将 track 方法移动到待办事项列表对象中,并远离项目。

因此,您请求对包含所有待办事项的对象进行更改,并在那里找到检查。

于 2012-04-20T10:26:44.827 回答
0

如前所述,ToDoList 应该强制执行约束,因为约束是在 ToDoList 级别定义的。(除非它是在用户级别定义的,如您所指出的,在这种情况下,责任将转移到那里)。您可以将方法保留在项目上,但它可以引用父待办事项列表。代码可能如下所示:

public class ToDoList
{
  public IList<ToDoListItem> Items { get; private set; }

  // factory method creates items as required by ToDoList
  public ToDoListItem Create(string title)
  {
    var item = new ToDoListItem(this, title);
    this.Items.Add(item);
    return item;
  }

  ToDoListItem currentItem;

  public void StartTrackTimeFor(ToDoListItem item) 
  {
    if (this.currentItem != null)
      throw new Exception();
    // could also throw different exception if specified item is current item being tracked
    // start time tracking logic.
    this.currentItem = item;
  }

  public void StopTrackTimeFor(ToDoListItem item)
  {
    if (this.currentItem != item)
      throw new Exception();
    // stop time tracking logic.    
    this.currentItem = null;
  }
}

public class ToDoListItem
{
  public ToDoListItem(ToDoList list, string title) 
  {
    this.ToDoList = list;
    this.Title = title;
  }

  public ToDoList ToDoList { get; private set; }

  public string Title { get; private set; }

  public void StartTrackTime()
  {
    this.ToDoList.StartTrackTimeFor(this);
  } 

  public void StopTrackTime()
  {
    this.ToDoList.StopTrackTimeFor(this);
  }
}
于 2012-04-25T19:24:45.483 回答