我正在创建将.html解析为数据库的项目(sqlite或其他类型,它还不重要)。数据库会有很多表,关系和理解架构会有些困难,好吧我会告诉你更简单的架构。
例如:
模特:
Subject
:SubjectId,Name Teacher
:TeacherId,SubjectFk,姓名,姓氏ClassRoom
:ClassRoomId,year Student
:StudentId,ClassRoomFk,姓名,姓氏关系(这不重要!):
一个学科由多位老师领导,一位老师只领导一门学科
一个ClassRoom包含许多学生,一个学生只属于一个classRoom
是唯一的一对:TeacherId,ClassRoomId(在一个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 - 包含将从路径读取文件并将数据转换为类模型的所有算法和类,例如:
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 */
我正在搜索知识如何组织我的最佳实践解决方案。我对我的做法和缺乏经验的批评持批评态度。
答案 0 :(得分:1)
您拥有的是两个数据源:一个用于读取(HTML文件),另一个用于写入(数据库)。理想情况下,您将隐藏从磁盘读取文件的方式以及它们如何持久保存到数据库。这就是Repository pattern的用途。
您的应用程序有一个明确的目的:它应该将文件中的数据导入数据库。创建一个存储库会使应用程序的体系结构变得不那么清晰。它首先从存储库中“读取”,然后再将其“写入”同一个存储库。
因此我建议创建两个Repository项目:一个ReadRepository
和一个WriteRepository
。这将使控制台应用程序项目变得非常简单:实例化存储库,查询ReadRepository
并保存到WriteRepository
。 Core
项目实际上将成为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过程。