在ASP.net MVC中,这两个实体的实现中哪一个更好

本文关键字:实体 两个 哪一个 实现 更好 net ASP MVC | 更新日期: 2023-09-27 18:01:10

我是ASP.net MVC的初学者。比WebForms更喜欢它。

因此,我决定启动一个包含大约6个表的项目:

  1. 画廊
  2. Admins
  3. 会话
  4. 会话图像
  5. 优惠
  6. 信息

我创建了两个项目:FP.WebUIFP.Domain

在我的域项目中,我创建了3个文件夹AbstractConcreteEntities

在Abstract文件夹中有6个接口IGalleryISessions。。等等。每个接口都有这样的东西:

namespace FP.Domain.Abstract
{
    public interface IGallery
    {
        IQueryable<Gallery> Gallery { get; }
    }
}

Concrete文件夹中还有另外7个类:EFDbGalleryEFDbSessions。。。以及继承自CCD_ 12类的CCD_。

上面的每个类(除了EFDbContext(,实现了每个相应的接口。

现在,当我思考它时,我发现我可以创建一个定义所有实体的接口,而在实现该接口的Concrete文件夹中只有一个类


我真的不知道什么更好:

6个接口每个实体有6个类

1个接口一个类返回所有实体。

在ASP.net MVC中,这两个实体的实现中哪一个更好

您似乎偶然发现了Repository模式。典型的体系结构决策是创建一个接口

interface IRepository
{
    IQueryable<Gallery> Query { get; }
}

然后让ORM类实现存储库接口。

class MyDbContext : DbContext , IRepository
{
}

现在,为了回答你的问题,我应该使用6个类和6个接口还是1个类和1个接口,答案绝对是否定的!

典型的模式调用GENERIC接口(因此实际上有6个接口,但只有一个接口源,如果需要额外的调用,可以扩展泛型(。

//Actually this implementation is edging on 
//Unit Of Work
interface IRepository<T>  
{
    IQueryable<T> Query { get; }
    void Insert(T item);
    void SaveChanges();
}

然后,您的EfContext将公开所有接口。原因是您的控制器通常只需要一个接口即可工作,这使得在控制器上进行模拟/伪测试变得更加容易(您不需要创建未使用方法的实现,如GalleryControllerTest的InfoQuery(。

如果您发现需要为任何接口提供特定于域的代码,则可以扩展IRepository接口。

interface IGalleryRepository : IRepository<Gallery>  
{
    void SomeSpecialOperation(Gallery item);
}

最后,如果/当您开始引入控制反转时,此模式的实现将使生活变得更加轻松。

PS我通常会将实际EF代码(即具体的存储库(重构成一个单独的程序集,这只是为了防止您决定从项目中删除EF。

我会使用7个类,因为它们有不同的职责。

相关文章: