领域驱动设计学习总结(二):图书借还问题
一、问题描述
1、用户从图书馆借书
2、用户把书还给图书馆
二、问题分析
1、这个业务里面有几个角色?
明面上,有用户(借书者)、图书馆、书三个。似乎只是简单的用户进图书馆-》拿书-》走人。
但是,有到图书馆借过书的人都知道,借书的流程应该是 进图书馆=》拿书=》登记=》走人。
是的,少了一个步骤,登记!!!!!!!!!!!
也就是说,在不知不觉中我们少了一个角色:图书馆管理员!
因此,业务里面的角色应该是:用户,图书馆,图书馆管理员,书!
2、这个业务由谁完成?
很明显,能够完成动作的只有两个角色,一个是用户,一个是图书馆管理员。
那么,让我们在重温下美好的大学期间发生在美丽的图书馆里面那些美妙的事情:
借书员:学生A
图书馆管理员:还书处老师
借书员急急忙忙的帮了一大堆书往图书馆的还书箱一塞,然后火烧屁股般的往教室赶。
---------------------------广告时间,休息十分钟------------------------------
在图书馆勤工俭学的童鞋们把还书箱的书一本本拿出来,送到了图书馆的还处。
图书馆管理员一边聊天打屁一边用扫描仪扫描图书,听到叮的一声后把书放到了另一侧。
至此,这些书终于回到了图书馆的怀抱。
或许有人会说,我们学校有自动还书机!好吧,那你就把你当成图书馆管理员可以不?
显然,当书被塞入还书箱的时候,还书的流程还没结束,但是借书员在还书流程中的任务已经结束了。
只有当图书馆管理员把书扫描后,还书的流程才算真的完成。
可见,还书的业务是由图书馆管理员完成的。
3、那么,用户在系统中干嘛?
额,不考虑用户自身的网上预订等功能,在借书、还书的过程中,用户只是一个书架的作用。
整个借书、还书的过程其实就是图书馆管理员把书本从书架A(图书馆)搬到书架B(用户)的过程。
三、建立模型
对于用户这个书架子来说,借书的同时应该也要遵守图书馆的规则,因此,借到书的时候需要还必须明确书本的借书日期和还书日期。
定义如下:
public class User { public string UserId{get;set;} public Role UserRole{get;set;}///用户角色,用来确定借书时需遵守的规则 public List<BorrowInfo> BookBorrowInfo{get;set;} public void AddBorrowInfo(Book _book,DateTime BorrowTime) { BookBorrowInfo.Add(new BorrowInfo(_book,BorrowTime,this.UserRole)); }
public void ReturnBook(Book _book,DateTime ActualReturnTime)
{
BookBorrowInfo.Find(r=>r.CurrentBook.BookId==_book.BookId).Update(ActualReturnTime);}
}
{
}
对于图书馆来书,图书的借出与还入并没有将书本从图书馆的书库里面移除,借与还对应的是书在图书馆中的状态改变。
因此图书馆定义如下:
public class Library { public string LibraryId{get;set;} public List<BookInfo> BookInfo{get;set;} public void AddNewBook(Book _book) { this.BookInfo.Add(new BookInfo(_book,BookState.InStock)); } public void DeleteBook(Book _book) { this.BookInfo.Remove(this.BookInfo.Find(r=>r.CurrentBook.BookId==_book.BookId)); } public void UpdateBookInfo(Book _book,BookState State) { this.BookInfo.Find(r=>r.CurrentBook.BookId==_book.BookId).UpDate(_book,State); } } public class BookInfo { public Book CurrentBook{get;set;} public BookState State{get;set;} public void UpDate(Book _book,BookState _state) { this.CurrentBook=_book; this.State=_state; } } public enum BookState { InStock, OnLoan, Book, }
最后,让我们看看图书管管理员的定义。
图书馆管理员应该如同无处不在的扫地阿姨一样,无所不在无所不能却又无处可循。定义如下:
public class LibraryManager
{
public void BookToUser(User _borrower,Library _library,Book _book,DateTime _borrowTime)
{
_borrower.AddBorrowInfo(_book,_borrowTime);
_library.UpdateBookInfo(_book,BookState.OnLoan);
}
public void BookToLibrary(User _returner,Library _library,Book _book,DateTime _returnTime)
{
_returner.ReturnBook(_book,_returnTime);
_library.UpdateBookInfo(_book,BookState.InStock);
}
}