ocean - Structured archive with multiple domain objects that inherit from common class -
i'm writing ocean plugin petrel , need persist custom domain objects, , seems point using structured archive data source. i've created common class hold lot of standard domain object stuff (droid, name, color, image, comments, history, etc), avoid rewriting every domain object create. ocean development guide has simple examples of classes no inheritance, given has version number, foresee potential problem when base class version different version of inherited-class-1 different inherited-class-2, , update in base class.
is possible use structured archive common base class? there special considerations versioning, or else need aware of?
eta: simple class diagram showing relationships , stuff i've tried
public abstract class classa | ----------------------------------- | | public class classb : classa public classc : classa public class classd { private list<classa> _myclassaobjects; }
all classes marked archivable
, , in classd
, _myclassaobjects
marked archived
. saves ok, when load, invalidcastexception
, tries cast list<classb>
list<classa>
. casting should work, since classb
inherits classa
, should not?
got answer schlumberger. possible, doing this:
[archivable] public abstract class abstract cdo { [archivablecontextinject] protected structuredarchivedatasource datasourcecore; [archived(name = "name")] private string _name; private abstractcdo _parent; [archived(name="parentdroid")] private droid _parentdroid; [archived(name = "droid")] protected droid droidcore { { return _droid; } set { if (_droid != value) { datasourcecore.isdirty = true; _droid = value; } } } public droid parentdroid { { return _parentdroid; } set { if (_parentdroid != value) { datasourcecore.isdirty = true; _parentdroid = value; } } } public abstractcdo parent { { return _parent; } set { if (_parent != value) { datasourcecore.isdirty = true; _parent = value; _parentdroid = _parent.droid; } } } protected abstractcdo(string name) { _name = name; datasourcecore = factory.get(); _droid = datasourcecore.generatedroid(); datasourcecore.additem(_droid, this); } } [archivable] public abstract class abstractcdocollection : abstractcdo, iobservableelementlist { [archived] private list<abstractcdo> _children; protected abstractcdo(string name) : base(name) { } public list<abstractcdo> children { { return _children; } } } [archivable] public class concreteobject : abstractcdo { public concreteobject(string name) : base(name) { // other stuff } }
the datasource property needs protected since injection had bug fixed in petrel 2013.3 / 2014.1.
Comments
Post a Comment