我正在尝试确定如何最好地构建 .NET Entity Framework 项目以实现良好的分层方法。到目前为止,我已经在玩家拥有和经营行星的基于浏览的游戏中进行了尝试。这是我得到它的方法:
网站
这包含了所有的前端。
C# 项目 - MLS.Game.Data
这包含带有我所有数据映射的 EDMX 文件。这里没有其他内容。
C# 项目 - MLS.Game.Business
这包含各种我称为“管理器”的类,例如 PlanetManager.cs。星球管理器有各种用于与星球交互的静态方法,例如 getPlanet(int planetID),它将返回从 MLS.Game.Data 生成的代码对象。
在网站上,我会做这样的事情:
var planet = PlanetManager.getPlanet(1);
它从 MLS.Game.Data(从 EDMX 生成)返回一个 Planet 对象。它有效,但它在一定程度上困扰着我,因为这意味着我的前端必须引用 MLS.Game.Data。我一直觉得 GUI 应该只需要引用业务项目。
此外,我发现我的 Manager 类往往会变得非常繁重。我最终会在其中包含许多静态方法。
所以...我的问题是 - 其他人如何布局他们的 ASP EF 项目?
编辑
不过,再过一些之后,还有一些困扰我的其他项目。例如,假设我有我的 Planet 对象,它也是从向导生成的代码。如果有一天我的星球需要有一个专门的属性,比如“人口”,它是基于星球对象的其他属性的某种计算。我是否想创建一个继承自 Planet 的新类,然后返回它? (嗯,我想知道这些类是否被 EF 密封了?)
谢谢
最佳答案
您可以尝试以下方法来改进:
- 使用 EF 在您的数据层中获取 DTO,然后使用这些 DTO 在您的业务层中填充更丰富的业务对象。然后您的 UI 才需要引用业务层。
- 一旦您创建了丰富的业务对象,您就可以开始从管理器类中内化一些逻辑,从而有效地清理业务层。
我个人更喜欢更丰富的模型而不是管理器模型,因为正如您所说,您最终会遇到大量静态方法,您不可避免地会在其他静态方法中链接在一起。我发现这太困惑了,更重要的是,更难理解和保证对象在任何给定时间点的一致性。
如果将逻辑封装在类本身中,则无论外部调用者的性质如何,都可以更加确定对象的状态。
顺便说一句,这是个好问题。
关于c# - .NET Entity Framework 项目布局(架构),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/549086/