Hi Brian,
You are indeed confused. Let me see if I can help.
"1. The model is nothing but entity mappings; a class modeling one
table should not involve any other tables. That sort of thing belongs
in the repository classes. "
Your model isn't just "entity mappings". Your model are the
business / domain objects that hold data and behavior (methods) and as
such, they will often hold references to each other, and you can use
NHibernate's lazy-loading or pre-fetching to get those related
objects. As such, there is nothing wrong with doing exactly what you
were doing before, where user1.AddFriend(user2) method creates a
relationship object and adds it perhaps to a relationship collection
if i'm understanding you correctly. In fluent, you would use HasMany
in your user mapping class so that a user has many relationships, and
each relationship has a reference to both users and a property for the
RelationshipType. This would not go in repository classes but in
Fluent mapping classes.
"For the sake of "dependency injection", I should not have my User
class create a Relationship object; I should create this Relationship
object separately and then pass it to the User class. "
Again, not so. Its okay for the User (IMHO) to instantiate another
domain object directly without using DI. So the user can instantiate
relationship objects thru its methods. Where you want to use D.I. is
between layers. So the presentation/ui layer such as web forms or MVC
controllers would not instantiate repositories, they would use DI to
hand them repositories thru their contsructors which would only spell
out the interface. I even have instantiate domain objects such as
users in my presentation layer because domain objects are fairly
technology neutral and not having references to things like nhibernate
or other similar services that are likely to change. However my
domain objects do not have any references to my repositories typically
or to nhibernate or anything but pure .NET code.
"But now this has me completely confused, because instead of making a
method to allow the controller to do "user1.AddFriend(user2)", the
controller instead has to know about the Relationship class, create a
new Relationship object, then call a "userRepository.AddRelationship
(user1, newRelationship)" method I'll write. This seems more
complicated. "
I'm not sure if you are talking about an MVC controller or some other
controller. But typically the Repository just does loads and saves of
some aggregate root object and you manipulate the domain objects to
handle the relationships.
So an asp.net MVC controller might do something like:
public ActionResult AddFriend(int userID, int friendID)
{
var user1 = this.userRepository.FindByID(userID);
var friend = this.userRepository.FindByID(friendID);
user1.AddFriend(friend); //AddFriend might create a relationship
object, give it a "friend" relationship type, add it to a collection,
etc.
this.userRepository.Save(user1); //saves user1, friend, and
relationships depending on cascade options in your fluent mappings
}
So repositories don't do mappings. They just have methods to find,
delete and save objects. The fluent mapping classes determine how
those objects get saved or loaded to the db schema. So in a fluent
mappign you can tell it when you save a user, save its relationships,
etc.
Hope this helps.
Fregas
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Fluent NHibernate" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/fluent-nhibernate?hl=en
-~----------~----~----~----~------~----~------~--~---