我正在開發一個應用程序,允許用戶將電影從一個位置複製到他們的用戶帳戶。爲此,電影將需要被複制到用戶的個人文件夾。域驅動設計和文件存儲
我面臨的問題是,當實際上覆制文件。目前,我有一個MovieFactory,在創建後,在工廠方法完成複製後立即將其放入MovieRepository中。這似乎工作正常。
然而,存儲庫和工廠不必知道彼此。理想情況下,我會做這樣的:
var movie = this.MovieFactory.CreateFromFile(new FileInfo("MyPhoto.mp4"));
this.MovieRepository.Add(movie);
現在我的想法是做Add
方法內的複製,因爲你基本上覆制到庫本身。但是,通過這樣做,電影的文件位置也會改變。因此,Add
方法必須修改movie
或返回一個新的但不同的影片實例。這聽起來像代碼味道給我,我完全卡在這種情況。
在說話時,文件位置不會被存儲。而是使用MovieFileLocator服務從多個其他電影屬性中推導出位置。
考慮到你抽象的位置,複製本身可能變得沒有必要,因爲物理位置可能變得無關緊要,並且隻影響電影的屬性。 –
然而,問題在於位置取決於電影是否實際存儲在存儲庫中。如果已放入,位置指向用戶文件夾中的某個位置。如果它不在存儲庫中,則該位置仍然是USB驅動器的原始源。 – Shammah
因此,只需將該項目添加到存儲庫即可更改該項目,這是困擾您並帶來代碼異味的原因。在我看來,這正是你應該改變的。但是,如果您將其視爲兩種不同類型的電影類,比如說OriginalContent和ImportedMovie,那麼像「ImportedMovie movie = repo.Import(OriginalContent)」這樣的操作會很有意義,因爲原始類和最終導入的電影。這可能也解決了即時更改屬性的問題,然後必須等待幾秒鐘才能複製文件。 –