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

How to transform EF Objects to WCF Models using Repository pattern

我正在尝试使用 entity framework 6 遵循存储库模式在 .NET 上构建我的第一个(休息?)WCF 服务。

所以我应该只公开服务中的简单对象,而不是整个 EF classes,对吗?

所以我构建了一个像这样的简单模型,代表数据库中的一些字段table:

[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);
}

和存储库摘要 class:

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 Class 链接到数据库 table):

public class FormasPagoRep : Repository<ANX_FormasPago>
{
}    

最后是我的 WCF 服务 class

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 class 并将其转换为 FormasPagoModel。当然,如果我需要例如 FormasPago_Save,我需要编写将我的模型 (FormasPagoModel) 转换为 EF class(ANX_FormasPago)

的确切相反代码

使用这段代码,对于每个数据库,我最终得到 table:

A) An EF class.

B) A Simplified Model class.

C) A concrete Repository.

D) A WCF Service method for each method.

所以,我走的路对吗?或者我只是把事情复杂化了。

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

理想的架构应该是这样的:

WCF --> Business Logic --> Repository --> Entity Framework

每一层只能与直接层对话

  • 存储库 returns 筛选的 EF 实体
  • 业务处理它们(可以使用多个存储库,执行计算和其他东西)
  • Businessreturns 简单的 DTO 对象(Business 不应引用 WCF)
  • WCF 获取 DTO 并将它们映射到 WCF 模型(顺便说一句,我会使用 AutoMApper)。此映射是必要的,因为 Business 不引用 WCF 组件(DataContract 和 DataMember 属性在 Business).
  • WFC 将模型发布到网络

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

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