繁体   English   中英

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

[英]How to transform EF Objects to WCF Models using Repository pattern

我正在尝试使用实体框架 6 遵循存储库模式在 .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 服务方法。

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

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

理想情况下,架构应该是这样的:

WCF --> 业务逻辑 --> 存储库 --> 实体框架

每一层都只能跟在层直接在它的右边

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

我也不会费心拥有一个抽象/基础/通用存储库。 迟早你会遇到一些丑陋的解决方法来处理不兼容的实体(拒绝遗赠问题)。

最终,您将拥有比您建议的更多的类,但每个类都将 承担单一职责 它们将更简单、更易于测试和更可重用(例如,您可以替换 WCF 层并使用 WPF 或 MVC 代替,而无需接触不同的层)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM