如何使用存储库模式将 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 代替,而无需触及不同的层)。
我正在尝试使用 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 代替,而无需触及不同的层)。