Bad practice to have models made up of other models?
I have a situation where I have Model A that has a variety of properties. I have discovered that some of the properties are similar across other models. My thought was I could create Model B and Model C and have Model A be a composite with a Model B property and a Model C property.
Just trying to determine if this is the best way to handle this开发者_JS百科 situation.
It's definitely valid in certain situations. Let's say you have a Person
class and a Company
class, and they have the common properties streetNumber
, streetName
, postcode
, etc. It makes sense to make a new model class called Address
that both Person
and Company
contain. Inheritance is the completely wrong way to go in such a situation.
When properties (e.g. state) are the elements of commonality, I definately tend towards using composition rather than inheritance. When using inheritance, its perhaps best to wait until behavior is the commonality, and overrides are needed now or imminently.
What you're looking at is creating an Aggregate Root. A core paradigm of the Domain Driven Design (DDD) principals.
Certain models in your app will appear to belong "at the top" or "as root" to other objects. For example in the case of customers you might have a Contact
model which then contains a collection of ContactPoint
s (names, addresses, etc).
Or a Post
(in the case of a blog), which contains a collection of Comment
s, a Tite, Body and a TagSet
(for tagging). Notice how the items i've highlighted
as objects - these are other model types as opposed to simple types (string
s, int
s, etc).
The trick will come when and how you decide to 'fill' these Aggregate Root trees/graphs. Ie. How will you query just for a single TagSet
? Will you go to the top and get the corresponding Post
first? Maybe you just wanted to rename the tag "aspnetmvc" to "asp.net-mvc" for all Post
s so you want to cut in and just get the TagSet
item.
The MVC Storefront tutorial has some good examples of this pattern. Take a look if you can.
精彩评论