解决方案层/Folder/project 层次结构 .NET 项目
Solution layers / Folder/project hierarchy .NET project
我正在创建一个项目,它将把 .html 解析为数据库(某种 sqlite 或其他,目前还不重要)。数据库会有很多表,关系和理解schema会有些困难,好吧,我会告诉你更简单的Schema。
例如:
型号:
Subject
: SubjectId, 姓名
Teacher
:TeacherId, SubjectFk, Name, Surname
ClassRoom
: ClassRoomId, 年份
Student
: StudentId, ClassRoomFk, Name, Surname
关系(不重要!):
一个科目由多个老师负责,一个老师只负责一个科目
一个教室里有很多学生,一个学生只属于一个class教室
是独一无二的对:TeacherId, ClassRoomId (在一个classRoom中只能是一个特定老师携带的物品,很多老师不能在一个classRoom中授课同一主题,我不确定...但这并不重要)。
现在我构建一个项目层次结构:
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 - 包含所有算法和 类 将从路径读取文件并将数据转换为 class 模型,例如:
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 */
我正在寻找知识,如何根据最佳实践组织我的解决方案。我愿意接受对我的方法和经验不足的批评。
您拥有两个数据源:一个用于读取(HTML 文件),一个用于写入(数据库)。理想情况下,您会隐藏文件是如何从磁盘读取的以及它们是如何持久保存到数据库中的。这就是 Repository pattern 的用途。
您的应用程序有一个明确的目的:它应该将数据从文件导入数据库。创建一个存储库会使您的应用程序的架构不那么清晰。它会首先从存储库 'read' 到 'write' 再到同一个存储库。
因此,我建议创建两个存储库项目:一个 ReadRepository
和一个 WriteRepository
。这将使控制台应用程序项目变得非常简单:实例化存储库,查询 ReadRepository
并保存到 WriteRepository
。 Core
项目实际上变成了 ReadRepository
。两个存储库都将使用 Domain
对象。
我还建议让 UI
控制台应用程序决定文件的存储位置。因此将位置存储在控制台应用程序的 App.config 中。这样你也许可以用命令行参数覆盖文件位置。
除了我之前提到的 ReadRepository 和 WriteRepository 之外的另一个选项是应用 Extract, Transform, Load (ETL) 方法。这是一种比较清晰的做法,主要是因为数据是单向的。
该解决方案将有一个 ParseData.Extract
项目(ReadRepository),它将 HTML 文件中的数据加载到 DTOs 中,这与 HTML 的数据结构相匹配文件。 ParseData.Transform
项目会将 DTO 转换为数据库模型(例如,如果您使用 Entity Framework,则为实体)。 ParseData.Load
项目将作为前面提到的 WriteRepository 将实体保存到数据库。
ParseData.UI
项目仍可用于编排 ETL 过程。
我正在创建一个项目,它将把 .html 解析为数据库(某种 sqlite 或其他,目前还不重要)。数据库会有很多表,关系和理解schema会有些困难,好吧,我会告诉你更简单的Schema。
例如:
型号:
Subject
: SubjectId, 姓名Teacher
:TeacherId, SubjectFk, Name, SurnameClassRoom
: ClassRoomId, 年份Student
: StudentId, ClassRoomFk, Name, Surname
关系(不重要!):
一个科目由多个老师负责,一个老师只负责一个科目
一个教室里有很多学生,一个学生只属于一个class教室
是独一无二的对:TeacherId, ClassRoomId (在一个classRoom中只能是一个特定老师携带的物品,很多老师不能在一个classRoom中授课同一主题,我不确定...但这并不重要)。
现在我构建一个项目层次结构:
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 - 包含所有算法和 类 将从路径读取文件并将数据转换为 class 模型,例如:
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 */
我正在寻找知识,如何根据最佳实践组织我的解决方案。我愿意接受对我的方法和经验不足的批评。
您拥有两个数据源:一个用于读取(HTML 文件),一个用于写入(数据库)。理想情况下,您会隐藏文件是如何从磁盘读取的以及它们是如何持久保存到数据库中的。这就是 Repository pattern 的用途。
您的应用程序有一个明确的目的:它应该将数据从文件导入数据库。创建一个存储库会使您的应用程序的架构不那么清晰。它会首先从存储库 'read' 到 'write' 再到同一个存储库。
因此,我建议创建两个存储库项目:一个 ReadRepository
和一个 WriteRepository
。这将使控制台应用程序项目变得非常简单:实例化存储库,查询 ReadRepository
并保存到 WriteRepository
。 Core
项目实际上变成了 ReadRepository
。两个存储库都将使用 Domain
对象。
我还建议让 UI
控制台应用程序决定文件的存储位置。因此将位置存储在控制台应用程序的 App.config 中。这样你也许可以用命令行参数覆盖文件位置。
除了我之前提到的 ReadRepository 和 WriteRepository 之外的另一个选项是应用 Extract, Transform, Load (ETL) 方法。这是一种比较清晰的做法,主要是因为数据是单向的。
该解决方案将有一个 ParseData.Extract
项目(ReadRepository),它将 HTML 文件中的数据加载到 DTOs 中,这与 HTML 的数据结构相匹配文件。 ParseData.Transform
项目会将 DTO 转换为数据库模型(例如,如果您使用 Entity Framework,则为实体)。 ParseData.Load
项目将作为前面提到的 WriteRepository 将实体保存到数据库。
ParseData.UI
项目仍可用于编排 ETL 过程。