在WinForms MDI中使用Entity Framework和存储库模式

Vik*_*man 5 abstraction entity-framework unit-of-work repository-pattern winforms

我们即将启动一个类似于前一个项目的新项目.我可以复制旧设计,但我对旧设计并不十分满意.

它是一个"标准"业务系统(销售,盘点,仓储等),构建在.Net 3.5(Winforms MDI)的后端,后端有Entity Framework.

所有表单都继承自baseform(继承Windows.Form).该表单公开了一个名为ObjectContext的属性,该属性在第一次调用时实例化一个新的ObjectContext.我认为这构成了一个非常好的UnitOfWork,在每种形式中都隔离了所有数据访问.

然而.

我已经将所有查询和常见CRUD封装在"可怜的勒芒存储库"中.这些存储库作为ObjectContext的属性公开.

因此,如果我想绑定并命令表单,我将调用OrderLinesGrid = ObjectContext.OrderRepository.GetOrderLinesByID(orderID).

OrderRepository获取对为表单创建的objectcontext的引用,如下所示

(在我的部分ObjectContext类中)

Private _OrderRepository as OrderRepository
Public ReadOnly Property OrderRepository as OrderRepository
Get
if _orderrepository is nothing then
_orderrepository = New OrderRepository(me)
end if
return _orderrepository
End Get
End Property
Run Code Online (Sandbox Code Playgroud)

我不喜欢这个是:

  1. 对存储库的调用是通过ObjectContext进行的.因此,我没有得到查询和我想要的dataaccesslayer之间的抽象.

  2. 对于我的域中的每个新类型,我需要在ObjectContext中创建一个属性

我对OrderRepository的调用应该只返回域对象,而不用担心它是如何持久化的.此外,我不能让每个存储库拥有它自己的ObjectContext,因为这需要我在引用时附加和分离对象,即Country到Order.Country属性.

我很感激有关此设计的任何想法和反馈:)

phi*_*ady 0

我建议你研究一下“洋葱”原理Repository模式和Luw模式。网络上有很多例子。

本质上,您使用 POCO 模型核心项目。没有提及 DAL 项目。您在 CORE 项目中声明 Repository 和 luw 模式的接口。

所以现在

UI layer -> instantiate context and DAL Object eg repository -> inject into CORE services.
Run Code Online (Sandbox Code Playgroud)

与此方法相关的还有控制反转或依赖注入模式。

如果您对虚拟存储库使用测试驱动开发,则可以确保遵守设计原则。