C# 解决方案层/文件夹/项目层次结构.NET项目
我正在创建一个将.html解析到数据库的项目(类似于sqlite或其他,它还不重要)。数据库将有许多表,关系和理解模式将是一些困难,那么我将向您展示更简单的模式 例如: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
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、姓名学生
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,我认为这是更好的解决方案!鲍里斯先生,谢谢:-)