So to get back to my original question: Is there no simple way that proxies are created for the entities in my collections and for new entities ?
On Sep 23, 11:12 pm, José F. Romaniello <[email protected]> wrote: > Believe me, the links that Fabio suggested are unrelated to this subject.... > He must have thought that you were trying to create a custom ProxyFactory > and extending the nhibernate proxies. > > 2009/9/23 Harm Neervens <[email protected]> > > > > > > > José, > > > In the third post Fabio suggested that you could show me some links: > > > >More than a custom-proxy-factory-factory y should use a custom > > >implementation of ObjectFactory.José, please, send to Harm the links where > > >he can see how have always a proxy, create proxy outside NH scope and how > > >use those proxy in Save, Update and Delete (in practice the links to the > > WPF > > >example in uNhAddIns and to your posts). > > > Can you please help me with that? > > > On Sep 23, 10:42 pm, José F. Romaniello <[email protected]> > > wrote: > > > There is a bunch of people that say: "don't inject repositories in your > > > entities.." > > > > 2009/9/23 José F. Romaniello <[email protected]> > > > > > Oh, ok.. Your context wraper looks like a repository or dao.I don't > > > > remember right now if there is an event for a get by id. > > > > > This case seems more suitable for dependency injection in entities: > > > >http://fabiomaulo.blogspot.com/2008/11/entities-behavior-injection.html > > > > > You don't have to touch your entities (it will inject in your Context > > > > property). > > > > > 2009/9/23 Harm Neervens <[email protected]> > > > > >> I created an interface called IContextWrapper. > > > >> My applications and business layers are only talking to that > > > >> interface. > > > >> the interface now looks like this (but will be extended :-)) > > > > >> public interface IContextWrapper: IDisposable > > > >> { > > > >> string ConnectionString { get; set; } > > > > >> T CreateObject<T>() where T : IEntity; > > > >> T GetObjectById<T>(object identity); > > > >> T GetObjectByKey<T>(string keyPropertyName, object keyValue); > > > >> T TryGetObjectById<T>(object identity); > > > >> T TryGetObjectByKey<T>(string keyPropertyName, object > > > >> keyValue); > > > >> IList<T> GetObjectsByQuery<T>(string npathQuery); > > > >> IList<T> GetObjectsBySql<T>(string sql); > > > > >> void DeleteObject(IEntity entity); > > > >> void Commit(); > > > >> void CommitObject(IEntity entity); > > > >> void Clear(); > > > >> bool ValidateBeforeCommit { get; set; } > > > > >> bool IsDeleted(IEntity entity); > > > >> bool IsUpForCreation(IEntity entity); > > > >> bool IsDirty(IEntity entity); > > > >> bool IsClean(IEntity entity); > > > > >> object GetObjectIdentity(IEntity entity); > > > >> } > > > > >> Now I have an implementation if IContextWrapper for each ORM > > > >> (NHibernate, EF, NPersist etc) > > > >> My Entities all implement IEntity and are derived form EntityBase: > > > > >> public interface IEntity > > > >> { > > > >> object ObjectIdentity { get; } > > > >> IContextWrapper ContextWrapper { get; set; } > > > >> bool IsDeleted { get; } > > > >> bool IsUpForCreation { get; } > > > >> bool IsDirty { get; } > > > >> bool IsClean { get; } > > > >> } > > > > >> public abstract class EntityBase: IEntity > > > >> { > > > >> protected IContextWrapper _ContextWrapper; > > > > >> protected virtual object GetObjectIdentity() > > > >> { > > > >> return _ContextWrapper.GetObjectIdentity(this); > > > >> } > > > > >> public object ObjectIdentity > > > >> { > > > >> get > > > >> { > > > >> return this.GetObjectIdentity(); > > > >> } > > > >> } > > > > >> public virtual IContextWrapper ContextWrapper > > > >> { > > > >> get > > > >> { > > > >> return _ContextWrapper; > > > >> } > > > >> set > > > >> { > > > >> _ContextWrapper = value; > > > >> } > > > >> } > > > > >> public bool IsDeleted > > > >> { > > > >> get { return _ContextWrapper.IsDeleted(this); } > > > >> } > > > > >> public bool IsUpForCreation > > > >> { > > > >> get { return _ContextWrapper.IsUpForCreation(this); } > > > >> } > > > > >> public bool IsDirty > > > >> { > > > >> get { return _ContextWrapper.IsDirty(this); } > > > >> } > > > > >> public bool IsClean > > > >> { > > > >> get { return _ContextWrapper.IsClean(this); } > > > >> } > > > >> } > > > > >> As you can see, when after an entity is instantiated I need to set the > > > >> ContextWrapper property of the Entity, otherwise the whole system > > > >> won't work. > > > >> Now I do this by implementing ILoadEventListener. Here is my > > > >> constructor for th NHibernate implementation of IContextWrapper: > > > > >> public ContextWrapper(string assemblyName, string connectionString) > > > >> { > > > >> _CacheInserted = new EntityCache(this); > > > >> _CacheDeleted = new EntityCache(this); > > > > >> NHibernateHelper.AddAssembly(assemblyName); > > > >> NHibernateHelper.SetConnectionString(connectionString); > > > > >> // TODO: investigate memory leaks and garbage collection > > > >> ILoadEventListener[] stack = new ILoadEventListener[] > > > >> { new global::NHibernate.Event.Default.DefaultLoadEventListener(), new > > > >> EntityLoadListener(this) }; > > > >> NHibernateHelper.GetConfiguration > > > >> ().EventListeners.LoadEventListeners = stack; > > > > >> IPostLoadEventListener[] stack2 = new > > > >> IPostLoadEventListener[] { new > > > >> global::NHibernate.Event.Default.DefaultPostLoadEventListener(), new > > > >> EntityPostLoadListener(this) }; > > > >> NHibernateHelper.GetConfiguration > > > >> ().EventListeners.PostLoadEventListeners = stack2; > > > > >> _Session = NHibernateHelper.GetSessionFactory().OpenSession > > > >> (); > > > >> } > > > > >> And here's the implementation of ILoadEventListener: > > > > >> public class EntityLoadListener : ILoadEventListener > > > >> { > > > >> IContextWrapper _ContextWrapper; > > > > >> public EntityLoadListener(IContextWrapper contextWrapper) > > > >> { > > > >> _ContextWrapper = contextWrapper; > > > >> } > > > > >> // this is the single method defined by the LoadEventListener > > > >> interface > > > >> public void OnLoad(LoadEvent @event, LoadType loadType) > > > >> { > > > >> if (loadType.IsAllowProxyCreation) > > > >> { > > > > >> ISessionImplementor source = @event.Session; > > > > >> IEntityPersister persister = > > > >> source.Factory.GetEntityPersister(@event.EntityClassName); > > > > >> EntityKey keyToLoad = new EntityKey(@event.EntityId, > > > >> persister, source.EntityMode); > > > > >> IPersistenceContext persistenceContext = > > > >> @event.Session.PersistenceContext; > > > > >> // look for a proxy > > > >> object proxy = persistenceContext.GetProxy(keyToLoad); > > > > >> if (proxy is IEntity) > > > >> { > > > >> (proxy as IEntity).ContextWrapper = > > > >> _ContextWrapper; > > > >> } > > > >> } > > > >> } > > > >> } > > > > >> So as you can see, if a proxy is loaded, I can set the ContextWrapper > > > >> of my Entity. > > > >> But if I have not proxy, the event will not fire and I'm not able to > > > >> set the ContextWrapper property. > > > >> Maybe now you understand why I need proxies all the time. > > > > >> Harm. > > > > >> On Sep 23, 9:16 pm, José F. Romaniello <[email protected]> > > wrote: > > > >> > Let's go back. You say that this code is in your base class, a base > > > >> class > > > >> > for what? > > > >> > What kind of classes inherit from this base? repositories, entities, > > > >> > services? > > > > >> > 2009/9/23 Harm Neervens <[email protected]> > > > > >> > > > Your design is somewhat flawed, maybe you'd like to revise it. > > > > >> > > This is not my design, but just some code snippet to express what > > my > > > >> > > intentions are. > > > >> > > I'm not posting this question to get critics at my design, but to > > get > > > >> > > a decent answer at my question. > > > >> > > I'm always told that open source communities were so helpfull :-( > > > > >> > > On Sep 23, 9:01 pm, "Francisco A. Lozano" <[email protected]> > > wrote: > > > >> > > > If your base classes are coupled to nhibernate, so is any class > > that > > > >> > > > derives from them. > > > > >> > > > Your design is somewhat flawed, maybe you'd like to revise it. > > > >> Getting > > > >> > > > the session through proxies from inside the entities is not > > > >> something > > > >> > > > I would expect to see on a well-designed application :/ > > > >> > > > Francisco A. Lozano > > > > >> > > > On Wed, Sep 23, 2009 at 20:20, Harm Neervens < > > [email protected]> > > > >> > > wrote: > > > > >> > > > > I want this because my entities are POCO, and bu that I mean > > real > > > >> > > > > Persistance Ignorant. > > > >> > > > > I have code in my entities that references ISessionFactory, I > > > >> create a > > > >> > > > > dependancy to the NHibernate framework, and that's not what I > > > >> want. > > > >> > > > > I'm building an abstraction layer between my domain model and > > the > > > >> ORM. > > > >> > > > > In that way we can change ORM framework whenever we want (just > > by > > > >> > > > > adjusting some configuration settings). > > > >> > > > > Some of our customers prefer NHibernate, other Entity > > Framework or > > > >> > > > > NPersist. > > > > >> > > > > When I always have proxies, then in my base class I can use > > ... > > read more »- 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 -~----------~----~----~----~------~----~------~--~---
