Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解决方案层/文件夹/项目层次结构.NET项目_C#_Oop_Parsing_Design Patterns_Hierarchical Data - Fatal编程技术网

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

C# 解决方案层/文件夹/项目层次结构.NET项目,c#,oop,parsing,design-patterns,hierarchical-data,C#,Oop,Parsing,Design Patterns,Hierarchical Data,我正在创建一个将.html解析到数据库的项目(类似于sqlite或其他,它还不重要)。数据库将有许多表,关系和理解模式将是一些困难,那么我将向您展示更简单的模式 例如: public class Student { public int StudentId {get;set;} public string Name {get;set;} public string Surname {get;set;} public int ClassRoomFk {get;set

我正在创建一个将.html解析到数据库的项目(类似于sqlite或其他,它还不重要)。数据库将有许多表,关系和理解模式将是一些困难,那么我将向您展示更简单的模式

例如:

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;}
}
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();
}
IParser parser = new Parser(Repository.MainFilePath);
List<ClassRoom> parser.Start();

/* LINQ or other actions..save to file or something else */
型号:

  • 主题
    :主题,名称
  • 教师
    :教师ID、科目FK、姓名、姓氏
  • 教室
    :教室ID,年份
  • 学生
    :学生ID、教室FK、姓名
关系(这并不重要!)

  • 一门学科由多名教师领导,一名教师只领导一门学科

  • 一个教室包含许多学生,一个学生只属于一个教室

  • 是独一无二的一对:TeacherId,ClassRoomId(在一个教室里,一个特定的老师只能携带一个物体,许多老师不能在同一个教室里教同一个科目,我不确定……但这并不重要)

  • 现在,我构建一个项目层次结构:

    解析数据-解决方案名称

    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;}
    }
    
    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();
    }
    
    IParser parser = new Parser(Repository.MainFilePath);
    List<ClassRoom> parser.Start();
    
    /* LINQ or other actions..save to file or something else */
    
    公共班级学生
    {
    公共int StudentId{get;set;}
    公共字符串名称{get;set;}
    公共字符串姓氏{get;set;}
    public int ClassRoomFk{get;set;}
    }
    公共课堂
    {
    公共int-ClasRoomId{get;set;}
    公共列表学生{get;set;}
    }
    
    ParseData.Core-包含从路径读取文件并将数据转换为类模型的所有算法和类,例如:

    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;}
    }
    
    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();
    }
    
    IParser parser = new Parser(Repository.MainFilePath);
    List<ClassRoom> parser.Start();
    
    /* LINQ or other actions..save to file or something else */
    
    public class StudentParse:IEntity
    {
    公立学生学生{get;set;}
    public StudentParse(字符串filePathWithDataForStudentsFromSpecialClass,int ClassRoomFk){(…)}
    /*将数据解析到StudentModel的所有方法*/
    }
    公共类ClassRoomParse:可扩展性
    {
    公共教室{get;set;}
    公共ClassRoomParse(字符串文件路径WithClassRoomsData){(…)}
    /*所有方法,将数据解析为ClassRoomModel*/
    }
    公共接口IParser
    {
    字符串filePathToMainFile{get;set;}
    列表开始();
    }
    
    ParseData.UI-控制台应用程序。在这里,我可以编写一些代码,这些代码将向我展示从featching数据得到的结果。例如:

    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;}
    }
    
    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();
    }
    
    IParser parser = new Parser(Repository.MainFilePath);
    List<ClassRoom> parser.Start();
    
    /* LINQ or other actions..save to file or something else */
    
    IParser parser=新的解析器(Repository.MainFilePath);
    List parser.Start();
    /*LINQ或其他操作..保存到文件或其他内容*/
    

    我正在寻找一种知识,即如何组织最佳实践的解决方案。我对我的方法和经验不足持批评态度。

    您拥有两个数据源:一个用于读取(HTML文件),另一个用于写入(数据库)。理想情况下,您应该隐藏如何从磁盘读取文件以及如何将文件持久化到数据库。这就是为什么

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

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


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

    除了前面提到的ReadRepository和WriteRepository之外,另一个选项是应用该方法。这是一种更清晰的方法,主要是因为数据是单向的

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


    ParseData.UI
    项目仍然可以用来协调ETL过程。

    ye,我认为这是更好的解决方案!鲍里斯先生,谢谢:-)