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)
我不喜欢这个是:
对存储库的调用是通过ObjectContext进行的.因此,我没有得到查询和我想要的dataaccesslayer之间的抽象.
对于我的域中的每个新类型,我需要在ObjectContext中创建一个属性
我对OrderRepository的调用应该只返回域对象,而不用担心它是如何持久化的.此外,我不能让每个存储库拥有它自己的ObjectContext,因为这需要我在引用时附加和分离对象,即Country到Order.Country属性.
我很感激有关此设计的任何想法和反馈:)
我建议你研究一下“洋葱”原理、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)
与此方法相关的还有控制反转或依赖注入模式。
如果您对虚拟存储库使用测试驱动开发,则可以确保遵守设计原则。
| 归档时间: |
|
| 查看次数: |
2319 次 |
| 最近记录: |