OOP/Repository模式:为不同的数据库访问子集创建过多的对象
本文关键字:访问 数据库 子集 对象 创建 Repository 模式 OOP | 更新日期: 2023-09-27 18:00:09
我正在将旧的VB6代码(是的,是的,VB6…)移植到C#。我正在重构代码,使其更加面向对象,除其他外,我正在实现访问数据库的存储库类。
现在,这些存储库类返回对象,而不是数据集。但我发现,有时我只返回对象可能包含的信息的子集。示例:我可以得到一个完整的文档列表,包括名称、文件路径、文件夹、创建者等,或者我可以得到只包含名称和文件夹的文档搜索结果。
对于这些子集情况,最佳实践是什么?我应该为这些只包含数据子集的数据库调用创建自定义对象吗?我应该返回只填充了部分字段的完整对象吗?还是应该只返回数据集?
理想情况下,一切都应该尽可能集中。这可以通过为每个子集创建一个查询对象来实现。我认为您可以选择返回一些字段已填充或为null的对象,这取决于您的数据库是否允许这些特定字段为null。
因此,将规则和逻辑与存储库类集中在一起,这样每个对象都会根据这些规则和逻辑一致地返回。
为对象创建一个下属架构,这样它们就不会变得太复杂。我认为需要的是为存储库考虑每个对象一个实体。同样,创建自定义对象或DTO可能会产生不必要的代码和复杂性。为了完整性,请将填充了某些字段的对象和该子集中不需要的其他字段保持为空,这样,如果以后查询此信息,则可以报告特定实体不存在值的信息。
这里有一个简单的例子,尝试将POCO类与实体框架一起使用。
public interface IRepository<TEntity, in TKey> where TEntity : class
{
TEntity Get(TKey id);
}
public class SomeRepo1 : IRepository
{
private readonly FileDbContext someDbContext;
public FileRepository(FileDbContext dbContext)
{
someDbContext = dbContext;
}
public File Get(string id)
{
return someDbContext.Files.ToList();
}
}
可用于文件的POCO类示例:
public class File
{
public int Id { get; set; }
public string FileName { get; set; }
}
public class Folder
{
public List<File> Files { get; set; }
}
更多详细信息请点击此处:https://msdn.microsoft.com/en-us/library/ff649690.aspx
希望这能有所帮助!
但我发现,有时我只返回对象可能包含的信息的子集。
您刚刚混淆了对象模型和持久性模型。
您知道,对象模型并不关心存储是如何实现的。具体来说,如果对象模型后面有一个数据库,并且您有包含一些数据的表,那么您可以随心所欲地将数据库映射到对象模型。例如,使用一个聪明的对象关系映射器,您可以将一个表拆分为两个类,或者在同一个表中保留多个类。
因此,从存储的角度来看,看起来像"子集"的东西,从对象模型的角度来看可能不是"子集"。
一个特定于Entity Framework 6的示例解决方案涉及所谓的表拆分,它允许您将模型类拆分为两个类,一个类具有始终加载的核心属性,另一个类带有辅助属性,仅当您引用核心类的虚拟属性时才延迟加载。
示例教程:http://www.c-sharpcorner.com/UploadFile/ff2f08/table-splitting-in-entity-framework-6-code-first-approach/
(只需提及,相反,其中两个物理表映射到oe模型类被称为实体拆分)