I am trying to use a custom collection on a business object via a collection factory class that implements IUserCollectionType
. The relevant methods on this class are implemented like so:
public object Instantiate(int anticipatedSize)
{
return new MyCustomCollection<T>()
}
public IPersistentCollection Instantiate(ISessionImplementor session, ICollectionPersister persister)
{
return new PersistentCustomCollection<T>(session);
}
My PersistentCustomCollection<T>
class inherits from MyCustomCollection<T>
and wraps an instance of PersistentGenericList<T>
:
public class PersistentCustomCollection<T> : MyCustomCollection<T>, IPersistentCollection
{
private PersistentGenericList<T> _wrapped;
public PersistentCustomCollection(ISessionImplementor session)
{
_wrapped = new PersistentGenericList<T>(session);
}
public PersistentCustomCollection(ISessionImplementor session, IList<T> list)
{
_wrapped = new PersistentGenericList<T>(session, list);
}
#region IPersistentCollection Members
public bool AfterInitialize(ICollectionPersister persister)
{
return _wrapped.AfterInitialize(persister);
}
// ... rest of IPersistentCollection interface, forwarding calls to _wrapped ... //
#endregion
}
The mapping I'm using looks like this:
<bag name="ChildCollection" generic="true" collection-type="Namespace.MyFactory`1[[My.ChildClass, MyAssembly]], FactoryAssembly">
<key column="PARENT_ID" />
<one-to-many class="ChildClass" />
</bag>
But now when I load a class with a child collection, it fails with an Invalid Cast error that says it cannot cast NHibernate.Collection.Generic.PersistentGenericList<My.Class>
to my MyCustomCollection<My.Class>
. So it looks like it's not calling my factory at all. Can anyone see why?