0

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

所以我决定开始一个包含大约 6 个表的项目:

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

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

在我的域项目中,我创建了 3 个文件夹AbstractConcrete并且Entities.

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

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

    }
}

文件夹内Concrete还有另外 7 个类 : EFDbGallery, EFDbSessions... 并且EFDbContext继承自DbContext类。

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

现在,当我想到它时,我发现我可以创建一个定义所有实体的接口,并且Concrete文件夹内只有一个类实现该接口。


我真的不知道什么更好:

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

或者

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

4

2 回答 2

1

您似乎偶然发现了存储库模式。典型的架构决策是创建一个接口

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

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

class MyDbContext : DbContext , IRepository
{

}

现在,要回答您的问题,我应该使用 6 个类和 6 个接口还是 1 个类和 1 个接口,答案绝对是 NO!

典型的模式需要一个 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 我通常将 ACTUAL EF 代码(即具体的存储库)重构为单独的程序集,以防万一您决定从项目中删除 EF。

于 2013-02-26T02:41:22.747 回答
0

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

.

于 2013-02-26T01:02:59.797 回答