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

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

我正在尝试在 .NET 上使用遵循存储库模式的 Entity Framework 6 构建我的第一个(休息?)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) 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

每一层只能与直接在它右边的层对话。

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

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

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

关于c# - 如何使用存储库模式将 EF 对象转换为 WCF 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31196071/

相关文章:

c# - 如何获取 Word 应用程序的 Hwnd/进程 ID,并将其设置为前景窗口

c++ - 测试 ODBC 连接的有效方法

c# - Entity Framework ,带有 dispose 方法的 UnitofWork 模式

c# - 将textBox1的内容替换为textBox2的内容

c# - 我想要一种用于元编程的预处理语言

sql - T-SQL 用户定义函数重载?

c# - SQL Server TDE 和 LINQ

wpf - 将生成的 ADO.Net DbContext 放入 View-Models 的最佳方法

asp.net-mvc - Entity Framework "Migrations Configuration"和 autofac

c# - RedirectStandardOutput 和批处理文件中的暂停命令