design-patterns - 模型、工厂和存储库

标签 design-patterns model

我正在将我们旧的基于 Active-Record 的 API 移植到一个新的结构,以使单元测试更容易等。我们正在使用存储库模式进行数据访问,并使用 StructureMap 进行依赖注入(inject)。

我现在正在为如何构建所有内容而苦苦挣扎。以我们的“产品”类为例,我们之前将模型、存储库和工厂部件都内置到产品对象中,例如加载、编辑和保存产品,我们可以这样(简化):-

Dim p As New Product
If(p.Load(1))
   p.Name = "New Name"
   p.Save()
End If

为了获取对象集合,我们在充当基本工厂的对象上使用了一个共享(静态)方法

Dim arrProds = Product.GetProducts()

查看几个示例后,在我们的新结构中,我们现在有一个 IProductRepository、IProductService(即工厂)和 Product 模型类。所以,像这样

Dim prodSvc = ObjectFactory.GetInstance(Of IProductService)
Dim prod = prodSvc.GetProduct(1) //Prod is an Instance of 'Product'
prod.Name = "New Name"
prodSvc.Save(prod)

但是,Product类具有加载相关数据的能力,例如

Dim arrRelatedProds = prod.RelatedProducts

Product 类内部是这样的

Class Product
    Function RelatedProducts() As IList(Of Product)
        // prodSvc is an instance of IProductService which is passed into the 
        // Product class in the constructor (or via Dependency Injection)
        Return Me.prodSvc.GetRelatedProducts(Me.ProductID)
    End Function
End Class

我不喜欢这样,因为它很难测试,而且我不喜欢我的“模型”类 (Product) 直接调用 IProductService 类。

有没有人对构建所有这些内容的更好方法有任何建议?

干杯

詹姆斯

编辑 可能是一年中问这个问题的错误时间!我可以添加任何说明以使这个问题可以回答吗?

最佳答案

当使用存储库模式而不是事件记录时,不要在域对象(产品)中引用存储库。这并非不可能,但如果不这样做,您就会省去很多麻烦。您能做的最好的事情就是使用支持延迟加载的 ORM。我个人为此使用 NHibernate。使您的存储库依赖于您的域对象,但域对象独立于存储库。最好的办法是根本不要在域对象中注入(inject)任何东西。

关于design-patterns - 模型、工厂和存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/397371/

相关文章:

c# - ASP.NET MVC 3.0 中的状态模式

python - 使用自定义字段扩展 Django 的 ManyToManyField

.net - 从数据库 Entity Framework Core 中选择多层对象

ruby-on-rails - 我怎样才能对模型中的长度验证做一个 if else 语句

android - 是否有任何设计模式可以应用于 Android 位置管理器帮助程序类?

design-patterns - 何时在类名中包含设计模式名称?

Android 职责分离示例

python - 使用 vars 的 TensorFlow 模型子类化 API 不显示参数或层

Json 到 Gson - 建模

Java-适配器设计模式实现变体