2010-09-06 142 views
0

我來自開發業務應用程序的背景,所以我習慣於MVC/n-Tier開發。模擬和實體框架

我的大多數應用程序都有一個架構是這樣的:

GUI -> BL (which deals with entities) -> DAL (SQL DB) 

現在,我想寫點東西這是一個交互式的故事和模擬之間的交叉 - 有一個持久的「世界」它可以讓你影響對象/ NPC。對象/ NPC的狀態會隨着時間的推移而變化(有時是由於您的操作),從而影響後續的選項。想想遺忘但沒有作戰

我知道,這是一個巨大的工程,我知道,我不能由我自己來實現像現代遊戲的複雜性任何一個小得多的規模 - 但這並不意味着我不應該試試:)

我的問題是這樣的:我應該使用什麼樣的架構?

我將需要故事元素庫 - 角色(NPC),地點,運輸機制,對象,任務,等等,等等

我會自然地傾向於這些存儲在SQL數據庫並使用實體框架訪問它們。

然後我需要能夠對這些元素執行操作/事件。這是我不清楚的地方。我通常的方法是擁有(比如說)一個NPCManager,它可以操縱NPC實體的方法 - 但是這對於多態性並不適用。

我想我需要使用繼承(一個接口)來處理每個元素將具有的所有功能。例如:

  • 元(基本對象的故事元素 - 相當於Object在.net)
  • NPC(繼承元素)
  • 衛隊(繼承NPC)
  • MountedGuard(繼承後衛)
  • 等等...

然後我就可以說:

  • 所有元素將有一個ID
  • 所有的NPC將有一個ID和一個名稱
  • 所有衛隊將有一個ID,名稱和忠誠
  • 所有MountedGuards將有一個ID,姓名,忠誠和安裝

這似乎並不與EF齧合以及 - 例如我不能有NPCManager.GiveClothing(NPC as NPC, ClothingItem as Clothing)的方法 - 因爲它傳遞一個MountedGuard將失敗(具體地,類將被視爲一個NPC不具有意義在數據庫方面...)

它也覺得我應該有方法來處理MountedGuard對象上的MountedGuard - 而不是在Guard或NPC經理上。

我是否應該有一組存儲信息的實體和一組完全獨立的類來表示由實體存儲的對象數據。例如:

Entities.MountedGuard 
Elements.MountedGuard - same properties as Entities.MountedGuard but also has a `Dismount()` method which affects the associated entity? 

所以我應該使用非POCO實體嗎?或根本沒有實體(在這種情況下,我如何定義「世界」?我絕對不想在代碼中完成這一切)

目前,我甚至沒有考慮過這些元素將顯示給用戶 - 目前,簡單的文本似乎很可能

如果有人可以請指點適當的架構或一些好的資源。

非常感謝

回答

1

我的$ 0.02:你可以在實體框架多重繼承策略,請參閱here;這可以讓你幾乎模擬你的域名,但是你希望 - 我特別看到Table-Per-Type(而不是每個具體類型的table)對你有用;這意味着代碼中的繼承結構將被數據庫密切地映射到一個非常明顯的自解釋結構中。你從哪裏拿到它取決於你,但關鍵是你可以使用與任何面向對象的代碼幾乎相同的策略。

+0

謝謝,那看起來正是我所需要的。現在我只需要弄清楚如何使用EF4 Code-Only來實現它:) – Basic 2010-09-06 10:09:51

+0

不客氣!然而,在研究這個答案時,我遇到了這個問題,這可能會也可能不會阻止你:http://samscode.com/index.php/2010/01/the-entity-framework-v1-and-v4-deal-breaker -tpt-inheritance/ – 2010-09-06 12:17:06

+0

這很有趣,但我_knew_我會讀一些關於在EF中被遺傳的繼承 - 這部分是什麼促使我發佈這個問題,但我自己找不到它,所以我一直在想象它。 .. 可能不會。在任何情況下,感謝您的解決方案,並提出:) – Basic 2010-09-06 13:45:14