我正在尝试使用实体框架6在Repository模式下在.NET上构建我的第一个(Rest?)WCF服务。
所以假设我必须只从服务中公开简单对象,而不是整个EF类,对吧?
所以我构建了一个简单的模型,它代表了数据库表中的一些字段:
[DataContract]
public class FormasPagoModel
{
[DataMember]
public int ID { get; set; }
[DataMember]
public string FormaPago { get; set; }
}
这是我的WCF服务方法返回的数据类型。所以我在我的服务上找到了一个GetbyID方法。为此,我创建了一个界面:
public interface IRepository<T> where T:class
{
T GetEntityByID(int Key);
}
和一个Repository抽象类:
public abstract class Repository<T> : IRepository<T> where T : class
{
protected readonly OhmioNETEntities context = new OhmioNETEntities();
public T GetEntityByID(int Key)
{
return context.Set<T>().Find(Key);
}
}
和具体实现(ANX_FormasPago是我链接到数据库表的EF类):
public class FormasPagoRep : Repository<ANX_FormasPago>
{
}
最后我的WCF服务类
public class WCFService
{
public FormasPagoModel FormasPago_GetbyID(int Key)
{
ANX_FormasPago EFEntity = new FormasPagoRep().GetEntityByID(Key);
return new FormasPagoModel
{
ID = EFEntity.ID_FormaPago,
FormaPago = EFEntity.FormaPago,
};
}
}
如您所见,我在内部获得了ANX_FormasPago类型的EF类,并将其转换为FormasPagoModel。当然,如果我需要例如FormasPago_Save,我需要编写将模型(FormasPagoModel)转换为EF类(ANX_FormasPago)的精确对位代码
使用这段代码,我最终得到了每个数据库表:
A)EF课程。
B)简化模型类。
C)具体的存储库。
D)每种方法的WCF服务方法。
那么,我是在正确的道路上吗?或者我只是让事情复杂化。
答案 0 :(得分:2)
我想,你几乎就在那里。在我看来,你实际上缺少一层(业务逻辑)。您的WCF服务不负责从存储库获取数据并将其转换为其他类型。原因是在许多情况下,最终模型对象的创建可能要复杂得多。我不想用它来混乱WCF服务。
理想情况下,架构看起来像这样:
WCF - &gt;业务逻辑 - &gt;存储库 - &gt;实体框架
每个图层只能在正确上与直接图层对话。
此外,我也不愿意拥有一个抽象/基础/通用存储库。迟早你最终会遇到一些丑陋的变通方法来处理不兼容的实体(Refused bequest问题)。
最终你会得到比你提议的更多的课程,但每个课程都会有single responsibility。它们更简单,更容易测试并且更具可重用性(例如,您可以替换WCF层并使用WPF或MVC而无需触及不同的层)。