[英]Which of those two entities implementations are better in ASP.net MVC
我是ASP.net MVC的初学者。 并且比WebForms更喜欢它。
因此,我决定启动一个包含约6个表的项目:
我创建了两个项目: FP.WebUI
和FP.Domain
。
在我的域项目中,我创建了3个文件夹Abstract
, Concrete
和Entities
。
在Abstract文件夹中,有6个接口IGallery
, ISessions
等。每个接口都具有以下内容:
namespace FP.Domain.Abstract
{
public interface IGallery
{
IQueryable<Gallery> Gallery { get; }
}
}
在Concrete
文件夹中还有另外7个类: EFDbGallery
, EFDbSessions
...和EFDbContext
,它们继承自DbContext
类。
上面的每个类( EFDbContext
除外)都实现了每个对应的接口。
现在,当我想到它时,我发现我可以创建一个定义所有实体的接口,而在实现该接口的Concrete
文件夹中只有一个类。
我真的不知道有什么更好的方法:
6个接口 ,每个实体6个类 。
要么
1个接口 , 1个类 ,返回所有实体。
您似乎偶然发现了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 I通常会将ACTUAL EF代码(即具体的存储库)重构为单独的程序集,以防万一您决定从项目中删除EF。
我将使用7个类,因为它们将承担不同的职责。
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.