> However, since there is no valid reason to make DelayedEnumerator public, i 
> would opt to return arrays instead of ienumerable instances 
> in your datacontracts, > and just do a .ToArray() when you're assembling your 
> CatalogsForSite object.  Your DataContracts shouldn't 
> mention anything about an implementation detail of your persistence layer IMO.

That is exactly what I suggested - just from a higher level perspective. I 
never said "lazy loading", I said "lazy evaluation". Sorry that it obviously 
wasn't clear enough. Once you call ToArray() your whole resultset 
"materializes", no matter if there were still outstanding records not loaded 
yet. But the more important point is - as you said - that one never should 
expose implementation details.

-Erich


From: [email protected] [mailto:[email protected]] On Behalf Of 
Davy Brion
Sent: Monday, July 27, 2009 12:34 AM
To: [email protected]
Subject: [nhusers] Re: Future<T> is not playing nice with web-services

it's indeed not a lazy loading issue... the problem is that the DataContract 
has one or more properties that are defined as IEnumerable<T>, but the 
DataContractSerializer will choke on that if those references are actually 
instances of DelayedEnumerator<T>.

If DelayedEnumerator were public, you could use the [KnownType] attribute on 
your IEnumerable properties to make sure the DataContractSerializer can deal 
with DelayedEnumerator types.

However, since there is no valid reason to make DelayedEnumerator public, i 
would opt to return arrays instead of ienumerable instances in your 
datacontracts, and just do a .ToArray() when you're assembling your 
CatalogsForSite object.  Your DataContracts shouldn't mention anything about an 
implementation detail of your persistence layer IMO.
On Mon, Jul 27, 2009 at 12:15 AM, mhnyborg <[email protected]> wrote:

I am not new to NH or the way lazy load works.

I work in a group of 6 developers and we have been working since new
year with NH over WCF and Silverlight as the UI.

when I call var c = stypes.Any(); I can see from the unit test that NH
is calling the databasen and that I have the corect data in all the
DelayedEnumerator.result list.

So it's not a lazy load problem.

On Jul 26, 11:56 pm, "Erich Eichinger" <[email protected]> wrote:
> how exactly do you expect a Future to work over a webservice with marshalling 
> in between? You should rethink your context boundaries - usually when 
> crossing an AppDomain boundary you should already have all data you need in 
> place and ready for marshalling them. Any form of lazy evaluation will hardly 
> work over the wire
>
> -Erich
>
>
>
> > -----Original Message-----
> > From: [email protected] [mailto:[email protected]] On
> > Behalf Of mhnyborg
> > Sent: Sunday, July 26, 2009 11:41 PM
> > To: nhusers
> > Subject: [nhusers] Future<T> is not playing nice with web-services
>
> > First I love how easy it is to use Future<T> but I think it's only
> > half baked. or put in another way only implemented for server side
> > code that is not returning a list.
>
> > I have this code that's is returning a lot of simple catalogs for
> > comboboxes
>
> > OperationContract]
> > public CatalogsForSite GetCatalogsForSite()
> > {
> > CatalogsForSite catalogsForSite;
> > using (var s = sessionManager.OpenSession())
> >  {
> >    var stypes = s.CreateCriteria(typeof
> > (ServitudeType)).Future<ServitudeType>();
> >    var ptypes = s.CreateCriteria(typeof
> > (ProtectionLineType)).Future<ProtectionLineType>();
> >    var cSysTypes = s.CreateCriteria(typeof(CSys)).Future<CSys>();
> >    var coordinatPrecissionTypes = s.CreateCriteria(typeof
> > (CoordinatPrecissionType)).Future<CoordinatPrecissionType>();
> >    var levelPrecissionTypes = s.CreateCriteria(typeof
> > (LevelPrecissionType)).Future<LevelPrecissionType>();
> >    var siteTypes =
> > s.CreateCriteria(typeof(SiteType)).Future<SiteType>
> > ();
> >    There is more ....
>
> >    // this is done to make NH do the querys. DO this while the
> > session
> > is open
> >    var c = stypes.Any();
>
> >    catalogsForSite = new CatalogsForSite
> >  {
> >    StdNotes = stdNotes,
> >    SiteStatus = siteStatus,
> >    Phases = phases,
> >    ProbabilityTypes = probabilityTypes,
> >    SystemTypes = systemTypes,
> >    RevisionTypes = revisionTypes,
> >    EnvironmentClassifications = environmentClassifications,
> >    ProjectClassifications = projectClassifications,
> >    MilestoneHolidays = milestoneHolidays,
> >    There is more ...
> > }
>
> > }
>
> > return catalogsForSite
> > }
>
> > The problem is that Future<T> is returning
> > NHibernate.Impl.DelayedEnumerator and that is not a type expected by
> > the webservice.
> > If the result on the DelayedEnumerator class was public then maybe I
> > could use that.
>
> > Hope to get some help with this.- Hide quoted text -
>
> - Show quoted text -





--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" 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/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to