我正在尝试在 .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/