域模型应该在哪个层中?

时间:2016-01-23 05:45:31

标签: c# .net entity-framework persistence business-logic-layer

我们必须为大学项目编写数字标牌应用程序代码。我们最初使用的语言和框架是:.Net,C#,实体框架(计划使用NHibernate),Winforms(计划使用WPF)。

我们被告知这样做可以让我们轻松地更改演示和持久性逻辑。

因此,我们决定使用三层:“知道”服务层(或业务逻辑层)的UI层,知道持久层和持久层的服务层。他们每个人都是一个单独的项目。 目前,域类或实体类(在本例中为Campaign,RSSFeed,User等类)包含在持久性项目或层下的“Model”命名空间中。

我们为数据访问逻辑定义了一些接口,以便能够轻松切换存储介质。

问题是:如果为了更改持久性逻辑,我们必须更改替换的实际项目引用(例如,NHibernate的实体框架),应该在哪里定义这个接口?更重要的是,应该在哪里定义域类?是否“有效”添加另一个名为“Domain”的层,由持久层和服务层知道?

如果我写的东西很奇怪,我道歉,我的书面英语有些生疏。

1 个答案:

答案 0 :(得分:0)

您可以做的是将持久性逻辑的接口提取到单独的项目中。然后将实现(EF或NHibernate)注入正在使用它的类中。这样,使用它的类只需要对包含接口的项目的引用,而不是对特定实现的引用。

对于域,您可以为每个域创建一组项目,如Domains.NameHere.Facade,Domains.NameHere.Implementation,Domains.NameHere.UnitTests。这样您还可以分离façade项目中的接口。您可以在Domains.Implementation项目中添加服务层,也可以在此处包含其他域类。

对于您的模型,您可以添加一个单独的项目,例如Domains.Models或将它们添加到您的façade项目中。对于持久性部分,您可以拥有自己的模型项目。这样,您可以更改模型中的某些内容,而无需更改持久性部分。