我试图确定如何最好地建筑师。净体框架项目,以实现一个很好的分层方法。迄今为止我已经尝试过了在浏览基于游戏的玩家拥有和操作的行星。这里就是我已经得到了它:

网站

这种包含所有前结束。

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对象上的“虚拟”财产和有经理把这一回它的组件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top