Hi. Take a look at the following StackOverflow post below. At my job, we 
are currently using a slightly modified version of the referenced post to 
wrap NHibernate's .Fetch() methods. Our organization has moved away from 
direct ISession usage to an IRepository<T> with great success.

StackOverflow post: http://stackoverflow.com/a/5742158/670028

As a side note, I really don't get the people bashing the concept of 
abstracting away the ISession. Who cares about the switching ORMs argument. 
I like the benefit that developers can simply have an IRepository<T> 
injected into the constructor of their classes and just use standard LINQ 
to do what they need to do to get the job done. Behind the IRepository<T>, 
you can implement whatever you want such as your own custom Unit of Work 
that makes sense for what your organization and application consider a unit 
of work. I'm not advocating that there is no need for direct access to the 
ISession at certain times but making it standard practice to use an 
IRepository<T> dramatically normalizes how queries look across the 
organization.

When people are allowed to use the ISession freely, you end up with all of 
NHibernate's various query APIs spread all over your code base with HQL, 
Critieria API, and QueryOver all jumbled up. Show a newcomer to the 
organization all of that craziness and they can feel overwhelmed. Or show 
them a standard IRepository<T> query where they are just using standard 
LINQ to query over an IQueryable<T> and it makes much more sense with 
almost no learning curve and the best part is that they can just get done 
quicker without all the ramp up of learning a new API ( or 3 APIs ) for 
data access.

All I'm saying is that there are legit reasons to wrap up the ISession and 
abstract away NHibernate internals. I can attest that it can be done and is 
being done successfully in an enterprise environment.


On Monday, August 13, 2012 2:52:05 PM UTC-5, Matteo Migliore wrote:
>
> Hi!
>
> I wrapped the ISession interface to an IRepository<T> (in a little more 
> complex way), now I've the problem to expose the eager loading feature
> so I want to have this:
> IRepository<T> : IEagerLoading<T>
> ...
>
> IEagerLoading<T> : IQueryable<T>
> {
>     IEagerLoading<T> Include<TRelated>(Expression<Func<T, TRelated>> path);
> }
>
> On the IRepository<T> I want to write customerRepository.Include(x => 
> x.Addresses).Include(x => x.MainAddress);
>
> Do you know a simple way to do that?
>
> Thanks,
> Matteo.
>

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/nhusers/-/4rzHaUXHo6YJ.
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/nhusers?hl=en.

Reply via email to