0

簡単な todolist があるとしましょう:

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

ここで、(ユーザーごとに) 一度に 1 つのアイテムに対してのみ時間が追跡されるように強制したいと考えています。

ItemTimeTrackingStartedそのようなドメイン イベントを作成する必要がありますStartTrackTimeITodoServiceこのイベントは、現在のユーザーに対して他の時間追跡アイテムがあるかどうかをチェックする (およびそれらを停止する)によってピックアップされます。それとももっと良い方法がありますか?

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 メソッドを todo リスト オブジェクトに移動し、アイテムから離すことです。

したがって、すべての todo アイテムを保持するオブジェクトから変更を要求すると、そこにチェックも配置されます。

于 2012-04-20T10:26:44.827 に答える
0

前述のように、制約は ToDoList レベルで定義されているため、ToDoList は制約を適用する必要があります。(あなたが示したようにユーザーレベルで定義されていない限り、その場合、責任はそこに移ります)。メソッドをアイテムに残すことはできますが、親の todo リストを参照できます。コードは次のようになります。

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 に答える