Модели, фабрики и хранилища - PullRequest
3 голосов
/ 29 декабря 2008

Я портирую наш старый API на основе Active-Record на новую структуру, чтобы упростить модульное тестирование и т. Д. Мы используем шаблон репозитория для нашего доступа к данным и StructureMap для внедрения зависимостей.

Сейчас я немного борюсь с тем, как все структурировать. Используя в качестве примера наш класс «Product», ранее у нас были части модели, репозитория и фабрики, встроенные в объект product, например, для загрузки, редактирования и сохранения продукта, который мы могли бы сделать (упрощенно): -

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

И чтобы получить коллекцию объектов, у нас был метод Shared (static) для объекта, который действовал как базовая фабрика

Dim arrProds = Product.GetProducts()

Посмотрев на несколько примеров, в нашей новой структуре мы теперь имеем IProductRepository, IProductService (который является фабрикой) и класс модели продукта. Итак, как-то так

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

Мне это не нравится, потому что это сложно проверить, и потому, что мне не нравится тот факт, что мой класс Model (Product) напрямую вызывает класс IProductService.

У кого-нибудь есть предложения по улучшению структуры всего этого?

Приветствия

Джеймс

EDIT Вероятно, не в то время года, чтобы спросить это! Могу ли я добавить какие-либо разъяснения, чтобы сделать этот вопрос ответственным ??

Ответы [ 2 ]

1 голос
/ 02 января 2009

При использовании шаблона хранилища вместо активной записи не следует ссылаться на хранилище в доменном объекте (продукте). Это не невозможно, но вы спасаете себя от множества неприятностей, когда этого не делаете. Лучшее, что вы можете сделать, это использовать ORM, который поддерживает отложенную загрузку. Лично я использую NHibernate для этого. Сделайте свой репозиторий зависимым от ваших доменных объектов, но доменные объекты независимыми от репозитория. Лучше всего вообще ничего не вводить в объекты вашего домена.

1 голос
/ 02 января 2009

Я не знаю, лучше это или хуже, но один из способов структурировать это - избавиться от всех умностей от вашего объекта / объекта передачи данных Product и поместить все, включая Create, Retreive, RetreiveAll, Save, GetRelatedProducts и т. Д. В IProductService. Это упростит ваш код Product, и вам не нужно будет волноваться, какой класс что делает.

...