.净体框架的项目布局(建筑)
-
23-08-2019 - |
题
我试图确定如何最好地建筑师。净体框架项目,以实现一个很好的分层方法。迄今为止我已经尝试过了在浏览基于游戏的玩家拥有和操作的行星。这里就是我已经得到了它:
网站
这种包含所有前结束。
C#项目MLS。游戏。数据
这包含EDMX文件,与我的所有数据映射。没有多少人在这里。
C#项目MLS。游戏。业务
这包含各种类,我称之为'管理者'如PlanetManager.cs。地球的管理所具有的各种静态的方法,是用于交互地球,例如 getPlanet(int planetID) 这将返回产生的代码对象从MLS。游戏。数据。
从该网站,我会做这样的事情:
var planet = PlanetManager.getPlanet(1);
它返回 这个星球 目从MLS。游戏。数据(所产生的从EDMX).它的工作原理,但这让我困扰的程度,因为它意味着,我的前结束具有参考MLS。游戏。数据。我一直认为,GUI应该只需要参考的业务项目。
此外,我发现我的经理人类往往会变得非常沉重。我会结束了与几十个静态的方法。
所以...我的问题-怎么大家别出他们的ASP EF项目?
编辑
经过一些虽然有额外的项目,它打扰我。例如,我们说,我有我这个星球的对象,这再次产生的代码的向导。如果有什么时间到了我的地球需要有一个专门的财产,说"人口",这是一个计算某种形式的基于其他属性的这个星球的对象。我会想到创建一个新的继承的类从地球,然后返回,而不是?(嗯,我不知道如果这些课程是密封的EF?)
感谢
解决方案
你可以尝试下到改善的事情:
- 使用EF获取的交互数据层,然后利用这些交互填充更丰富的业务对象在业务层。你的用户界面只会然后需要参考的业务层。
- 一旦你已经创造了丰富的业务对象,你可以开始一些内部消化的逻辑从管理课程,有效地清理业务层。
我个人比较喜欢更丰富的模型管理模式,因为,正如你所说,你结束了一个负载的静态的方法,其inevitibly端链接在一起的内部其他静态的方法。我觉得这都太混乱,更重要的是,难以理解,并保证的一致性对象在任何给定的时间点。
如果你封内的逻辑类本身可以更某些国家的对象,无论性的外部呼叫者。
一个很好的问题的方式。
其他提示
IMHO,您当前的布局是好的。这是完全正常的,你的UI参考“数据”层你调用它。我想,也许你关注的是,由于术语出现。 “数据”你所描述更经常被称为“业务对象”(BOL)层。再一个常见的布局将是有一个商业逻辑层(BLL),这是你的“经理”层和数据访问层(DAL)。在你的情况下,LINQ到entites的(假设你将使用)是您DAL。然后,正常参考图案将是: -
UI引用BLL和BOL。 BLL refences BOL和DAL(LINQ到的entites)。
看一看本系列文章的更多细节。
至于你的第二个问题(后EDIT)如果你需要或想要的功能添加到您的EF对象可以使用部分类。右击EDMX文件,并选择视图的代码。
或者,如果这是不够的,你可以沟设计和编写自己的启用EF类。
有两个选项一个(简要)这里的讨论 - http://msdn.microsoft.com/en-us/library/bb738612。 ASPX
至于 “EDIT” 部分中的第二个问题:
如果我没有记错,由EF生成的类不是密封的,而且他们的偏的课程,让你可以轻松地扩展那些没有接触生成的文件本身。
生成的类将是:
public partial class Planet : global::System.Data.Objects.DataClasses.EntityObject
{
...
}
让您可以轻松创建自己的“PlanetAddons.cs”(或任何你想将它命名),以扩展这个类:
public partial class Planet
{
property int Population {get; set;}
...
}
漂亮整齐,是吗?没有必要以导出和人工创建对象层次....
马克
我不是专家,但听起来很不错。这类似于我在我的解决方案,除了我刚刚合并与商业项目的EF项目。我的解决方案是没有那么大,我的对象并不需要很多的智力,所以其对我的罚款。我也有一吨的不同方法,我的每个静态辅助类的。
如果您不希望表现层知道有关数据访问层做,那么你必须创建一些中介类,这可能将是一个很大的工作。所以,什么你的当前设置的问题?
您的布局看起来确定。 我已经添加了一个实用程序/公共层
网络用户界面,点击 业务层结果 数据对象结果 公用事业层结果
我要补充的是在数据层中的实体的“哑对象”表示(即,仅属性)的DTO到您的业务层。然后你的“经理”类可以退货,如:
class PlanetManager
{
public static PlanetDTO GetPlanet(int id) { // ... }
}
和您的UI只能经由波苏斯的BLL层处理;经理(我称之为一个“映射”级)处理所有对象和数据层之间的翻译。此外,如果你需要扩展类,你可以有DTO对象上的“虚拟”财产和有经理把这一回它的组件。