如何使用存储库模式将EF对象转换为WCF模型

时间:2015-07-02 23:10:27

标签: c# sql-server entity-framework wcf repository-pattern

我正在尝试使用实体框架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服务方法。

那么,我是在正确的道路上吗?或者我只是让事情复杂化。

1 个答案:

答案 0 :(得分:2)

我想,你几乎就在那里。在我看来,你实际上缺少一层(业务逻辑)。您的WCF服务不负责从存储库获取数据并将其转换为其他类型。原因是在许多情况下,最终模型对象的创建可能要复杂得多。我不想用它来混乱WCF服务。

理想情况下,架构看起来像这样:

  

WCF - &gt;业务逻辑 - &gt;存储库 - &gt;实体框架

每个图层只能在正确上与直接图层对话。

  • 存储库返回已过滤的EF实体
  • 业务处理它们(可以使用多个存储库,执行计算和其他工作)
  • Business 返回简单的DTO对象( Business 不应引用WCF)
  • WCF 抓取DTO并将它们映射到 WCF 模型(我为那个btw使用AutoMApper)。由于 Business 未引用 WCF 组件( Business 中无法访问DataContract和DataMember属性),因此必须使用此映射。
  • WFC 将模型发布到网络

此外,我也不愿意拥有一个抽象/基础/通用存储库。迟早你最终会遇到一些丑陋的变通方法来处理不兼容的实体(Refused bequest问题)。

最终你会得到比你提议的更多的课程,但每个课程都会有single responsibility。它们更简单,更容易测试并且更具可重用性(例如,您可以替换WCF层并使用WPF或MVC而无需触及不同的层)。