使用 entity framework 6 和 Visual Studio 2015,业务逻辑方法在分层应用程序中的位置

Where do business logic methods go in a layered application using entity framework 6 with Visual Studio 2015

我正在使用 Visual Studio 2015 与 Entity Framework 6 和 .NET 4.5.2。我正在构建一个 WinForms 应用程序。我以分层方式构建了我的应用程序,如下所示:

解决方案名称是 TrackingSystem。

解决方案下的项目有:

TrackingSystem.Domain类 项目包含几个 class 定义,这些定义是从 Entity Framework Power Tools 附加组件生成的。这些是简单明了的 POCO 样式文件。只是每个域实体的 class 名称和属性。示例:

Public class Location
{
  int locationId {get;set;}
  string businessName {get;set;}
  string cityLoc {get;set;}
  string stateLoc {get;set}
  string zipCodeLoc {get;set;}
}

我在我的 TrackingSystem.UI 项目中引用了 TrackingSystem.Domain类 项目,并将其包含在我的 WinForms 代码区域的 uses 语句中。我以这种方式设置它,所以我不会在我的域层中公开所有 classes 和方法。

我现在的问题是对各个实体的请求的放置。例如,假设我想添加如下请求:

public List<Location> getAllLocations();  

我不想将其添加到 TrackingSystem.Domain类 项目中的位置 class,因为那些 class 是简单的 POCO。

因为这是域在询问 DAL 后会提供的内容,所以我希望它位于 TrackingSystem.Domain 项目下的 class 中。这是我不确定如何进行的地方。我可以在名为 Location 的 TrackingSystem.Domain 项目下创建一个 class,但我会在解决方案中有一个重复的 class 名称。所以也许我可以将其命名为 LocationServices,我可以在其中添加与 Location 实体相关的请求。如果我这样做,我不确定它是否应该位于 TrackingSystem.Domain 项目的根目录下,或者可能位于名为 DomainEntityServices 的文件夹下。无论我把它放在哪里,我都会为与其他 classes(即 ProductServices)相关的请求创建类似的 classes。

对于其他人如何设置它或者是否有指南文档在某个地方解决如何为分层解决方案设置 Visual Studio 项目,我将不胜感激。提前致谢。

更新说明 2015 年 11 月 21 日 7:11 上午 我找到了一个示例项目,它展示了一个将 POCO 和实现代码放置在项目中的案例。在这种情况下,POCO 和 BLL 位于不同的项目中,但它们保留了相同的实体名称。在这种情况下,Customer.cs 文件存在于 POCOs 项目和 BLL 项目中,其中 BLL 项目包含实现,而 POCO 项目仅包含 POCO 内容。示例项目在下面 URL:

https://code.msdn.microsoft.com/Multilayered-Architecture-703a0d69

更新说明 2015 年 11 月 20 日 1:36 下午 特别是,我正在寻找当请求的服务可以在域中得到回答而无需询问 DAL 时要做什么,例如以下业务规则:城市必须是圣贝纳迪诺。在这种情况下,我应该在域中的什么地方放置不需要与 DAL 检查的规则检查?我是否创建一个新的 class 类似 LocationServices 的逻辑来检查此规则,如果是这样,考虑到我的项目已经在哪里,class 将被放置在 Visual Studio 项目中的什么地方?

在这种情况下,我会在域中有一个接口

public interface IAmALocationsRepository 
{
   List<Location> getAllLocations(); 
}

您在您的域中使用此界面。

在您的 DAL 中实现它

public class LocationsRepository : IAmALocationsRepository 
{
   public List<Location> getAllLocations()
   {
     //do things here
   }
}

通过这种方式,您的域表明可能存在我可以使用的位置列表,但我不在乎它来自哪里。

并且您的 DAL 提供了列表,而域不知情。