[ https://issues.apache.org/jira/browse/PIVOT-513?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12876073#action_12876073 ]
Appddevvv commented on PIVOT-513: --------------------------------- The specific problem to solve is object initialization using complex resource object graphs, such as with ORM, services and other application elements that are part of the controller tree. DI is suppose to be non-intrusive which means that you should not be wiring these objects inside your objects, but have the DI-container wire them together. Because the serializer as actually acting like a very light version of a DI-container (object instantiation, some initialization and object access), there are some lifecycle tasks that can only be intercepted inside the serializer class itself. I've noticed that the wpf xaml serializer is starting to look alot more like a DI-container and allow finer-grained control over object instantiation and lifecycle management. This makes any serializer more of a full lifecycle manager versus a straight serializer. Whether its was intentional or not, the WTKX serializer has elements of a DI-container. Some of the demos already suggest this. One of the demos and some recent pivot user list posts asked about getting data into the component. One solution was to create it in code (not great) other said to use an object that in the constructor (or other tricks) will initialize the data (which was also a bit clumsy). Even in that simple scenario, potentially creating and initializing the object in a custom way could make sense for a specific application. That was for a simple list. For more complex data and data access methods, the small internal API change proposal allows you to support more complex scenarios using different composition technologies and different ways of implementing. Wpf has found that their simple "create a object data provider" and other approaches is not realistic or helpful for corporate production applications and that the data context has to be set using code because the objects behind the scenes have complex initialization requirements. The reason that you need the hook is that you need fine grained control over when objects are created (and how) and how they are initialized before used--this allows clients to implement their application using their design approaches. Think about the WTKX annotation. It performs initialization of an element after the WTKX is loaded and in the processEndElement method. This initializes the objects bottoms-up, post-traversal order (I think) in the tree--which is fine for UI components but not necessarily correct for non-UI components. In addition, deserialization is highly specialized especially when the conventions and practices of constructing the UI tree: there are mini-DSLs programmed into WTKX deserializer such as with styles, ids, or attached properties. In one scenario, a tree branch model is created using about 10 collaborating objects (it accesses a couple of backing databases using hiberate) many of which I don't have control over or can modify the source. The collaborating objects, however, are wired together in a DI container and the tree branch model is wired with those collaborating objects in a DI container. The tree branch model sits in a view/controller that has multiple components to handle communication with a small workflow and event handling facility. So rewriting serialization in another container environment is a large task and not using the WTKX deserializer is a huge productivity hit. Adding these simple hooks I have in the patch allow *some* flavors of integration (the patch allows different kinds to be created) and is sufficient for the moment and less intrusive on the pivot serializer. It doesn't force things on clients that don't want them but allows hooks for those who need to intercept and enables more client flexibility--they don't have to write code that exactly conforms completely to a specific instantiation and initialization approach. There are many ways to do all of this and this approach enables a number of other ways that can meet a range of application needs. They both work well on their own but a small meeting in the middle is sometimes needed. This is also why pivot has its own application context class, to control the creation, lifecycle and access of objects relevant to it. Although in the case of DesktopApplicationContext as near as I can tell, it too does not need to assume that it creates the Application instance but does and hence, external objects cannot create it and will make it less easy to add additional client initialization flexibility e.g. preference getting/setting or app icon setting, OSGi starting, creating the Application in a WTKX file, etc. > allow instance creation customization when reading WTKX files by creating an > instance creation factory method inside the serializer class > ----------------------------------------------------------------------------------------------------------------------------------------- > > Key: PIVOT-513 > URL: https://issues.apache.org/jira/browse/PIVOT-513 > Project: Pivot > Issue Type: Improvement > Components: wtk > Reporter: Appddevvv > Priority: Minor > Fix For: 1.6 > > Attachments: serializer.patch > > > In order to allow instance creation customization, change the serialization > class by: > a) Creating a protected instance creation method in the WTKXSerializer class. > b) Change a private constructor to protected. > c) Allow the creation of custom serialization instances when recursing into > the tree by creating a protected serialization creation method. > No client visible APIs are changed. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.