解决方案层/文件夹/项目层次结构.NET项目

时间:2015-04-18 19:39:47

标签: c# oop parsing design-patterns hierarchical-data

我正在创建将.html解析为数据库的项目(sqlite或其他类型,它还不重要)。数据库会有很多表,关系和理解架构会有些困难,好吧我会告诉你更简单的架构。

例如:

模特:

  • Subject:SubjectId,Name
  • Teacher:TeacherId,SubjectFk,姓名,姓氏
  • ClassRoom:ClassRoomId,year
  • Student:StudentId,ClassRoomFk,姓名,姓氏

关系这不重要!):

  1. 一个学科由多位老师领导,一位老师只领导一门学科

  2. 一个ClassRoom包含许多学生,一个学生只属于一个classRoom

  3. 是唯一的一对:TeacherId,ClassRoomId(在一个classRoom中只能有一个特定教师携带的对象,很多教师不能在同一科目的班级教学,我不确定...但它不是重要)。

  4. 现在我构建了一个项目层次结构:

    ParseData - 解决方案名称

    ParseData.Repository - 它包含App.Config,其中包含存在数据的根文件夹的应用程序设置。

    ParseData.Domain - 将要解析的数据模型的类,例如:

    public class Student
    {
        public int StudentId {get;set;}
        public string Name {get;set;}
        public string Surname {get;set;}
        public int ClassRoomFk {get;set;}
    }
    
    public class ClassRoom
    {
        public int ClasRoomId {get; set;}
        public List<Student> Students {get;set;}
    }
    

    ParseData.Core - 包含将从路径读取文件并将数据转换为类模型的所有算法和类,例如:

    public class StudentParse : IEntity<Student>
    {
        public Student Student {get; set;}
        public StudentParse(string filePathWithDataForStudentsFromParticularClass, int ClassRoomFk) { (...) }
        /* All methods, which will parse data to StudentModel */
    }
    
    public class ClassRoomParse : IEntity<ClassRoom>
    {
        public ClassRoom ClassRoom {get;set;}
        public ClassRoomParse(string filePathWithClassRoomsData) { (...) }
        /* All methods, which will parse data to ClassRoomModel */
    }
    
    public interface IParser
    {
        string filePathToMainFile {get;set;}
        List<ClassRoom> Start();
    }
    

    ParseData.UI - 控制台应用程序。在这里,我可以编写一些代码,这些代码将显示特征数据的结果。例如:

    IParser parser = new Parser(Repository.MainFilePath);
    List<ClassRoom> parser.Start();
    
    /* LINQ or other actions..save to file or something else */
    

    我正在搜索知识如何组织我的最佳实践解决方案。我对我的做法和缺乏经验的批评持批评态度。

2 个答案:

答案 0 :(得分:1)

您拥有的是两个数据源:一个用于读取(HTML文件),另一个用于写入(数据库)。理想情况下,您将隐藏从磁盘读取文件的方式以及它们如何持久保存到数据库。这就是Repository pattern的用途。

您的应用程序有一个明确的目的:它应该将文件中的数据导入数据库。创建一个存储库会使应用程序的体系结构变得不那么清晰。它首先从存储库中“读取”,然后再将其“写入”同一个存储库。

因此我建议创建两个Repository项目:一个ReadRepository和一个WriteRepository。这将使控制台应用程序项目变得非常简单:实例化存储库,查询ReadRepository并保存到WriteRepositoryCore项目实际上将成为ReadRepository。两个存储库都将使用Domain个对象。

我还建议让UI控制台应用程序决定文件的存储位置。因此,将位置存储在控制台应用程序的App.config中。这样,您可以使用命令行参数覆盖文件位置。

答案 1 :(得分:1)

我之前提到的ReadRepository和WriteRepository之外的另一个选项是应用Extract, Transform, Load (ETL)方法。这是一种更清晰的方法,主要是因为数据只是单向的。

解决方案将有一个ParseData.Extract项目(ReadRepository),它将HTML文件中的数据加载到DTOs中,与HTML文件的数据结构相匹配。 ParseData.Transform项目会将DTO转换为数据库模型(例如,如果您使用实体框架,则为实体)。然后,ParseData.Load项目将充当前面提到的WriteRepository,以将实体保存到数据库中。

ParseData.UI项目仍可用于编排ETL过程。