C# - 提供自定义类的存储库与服务

时间:2018-02-01 05:59:50

标签: c# entity-framework repository-pattern

美好的一天,

我希望有一个基于实际企业级应用程序的干净代码。我知道如何实现存储库和服务,但我不确定我是否正确这样做。

假设我有一个自定义类(主要用于json结果)

handleUpdateValueForCharacteristic

我有一个模型类(连接到我的dbcontext)

public class CustomClass{
    public string Name { get; set; }
    public string Age { get; set; }
}

这是我提供Custom Class

的第一个示例存储库
public class Employees{
    public string Name { get; set; }
    public string Age { get; set; }
}

这是我的第二个样本,存储库提供第一个,然后是服务。

// in repository file only
public IEnumerable<CustomClass> SupplyCustomClass(){
     return context.Employees.Select(obj=>new CustomClass{
          Name = obj.Name,
          Age = obj.Age
     }).ToList();
}

两个实现都执行相同的结果。但我想了解在企业发展水平上遵循规则的最佳方法。

2 个答案:

答案 0 :(得分:0)

从你的两种方法来看,我认为第二种方法更好。存储库应该与模型一起使用,而不是与ViewModels一起使用。作为另一项改进,您可以使用存储库模式实现Unit of Work Pattern

答案 1 :(得分:0)

使用您描述的两种方法,我建议使用调用存储库的服务层(根据您的第二个示例)。这样可以明确区分关注点,因为只有存储库处理数据管理。

然而,需要考虑的重要事项是,在您的示例中,第二个示例效率极低。您的第一个示例将从数据库中提取2列数据并构建您的类,其中第二个示例将整个集合实现为列表,然后您在内存中使用它会对数据库造成压力以及你的主持人。

这是模型和视图模型之间明显分离可能变得混乱的地方。您可以让存储库吐出视图模型以保持性能,也可以从存储库层返回IQueriables来使用。我个人会建议让存储库返回视图模型,如果它是您需要的有限数据集,但保留所有其他逻辑在服务层内完成。这将存储库维护为直接处理数据的层。在一个基本的例子中,例如你的服务,你会在服务中做什么工作并不明显,但是一旦数据被拔出,你会想做很多事情,当你充实你的项目时就会变得清晰。通过这种分离,您可以在获取数据的内容与可能与该数据一起使用的服务之间划清界限,从其他API或其他与数据库无直接关系的一般工作中提取数据。

实体框架性能考虑的简短版本是您希望尽可能少地提取数据,并尽可能长时间地将其保留为IQuerable。一旦运行.ToList()或迭代集合实体框架将实现结果集。