Hi Marc, There's nothing wrong with writing a bean to simplify access to your transfer objects data in your views. Anything that simplifies code and removes logic from a view is usually a good thing. I've not got a lot of experience of transfer, but i think a decorator might work fine for this.
However its not a good idea to inject an instance of DataBean into your service. You've already identified why this is a bad idea. DataBean is a transient so a new instance should be created every time get() is called <cfreturn new model.beans.DataBean().populate(myTransferObject)> That said, if the only purpose of DataBean is to provide data in a format for your view then it should be created in your controller. ie. your service returns the raw Transfer object to the controller and the controller create a new instance of DataBean, populates it and the sets it into the event. Chris On 11 October 2011 12:57, marc <[email protected]> wrote: > Hi, > > I actually have 2 questions: about the possibility of Bean data getting > corrupted by multilpe requests and the use of Transfer objects in my views. > > I have a ModelGlue application where I use ModelGlue,Coldspring (1.2) and > Transfer. Currently, a request for a page looks like this: > > MG gets request "Page.get" > > 1) function get() in Controller Page.cfc gets called > 2) function get() in Service Page.cfc gets called > 3) function get() in Gateway Page.cfc gets called. > 4) function get() in Gateway Page.cfc uses Transfer to get data from db and > returns a Transfer object. > > then the chain reverses: > > 5) Gateway returns result to Service > 6) Service returns result to Controller > 7) Controller places Bean in eventscope. > > 8) The View reads and displays values from the Transfer bean. > > What I want to do in step 6 before returning values to the Controller is to > copy the values in te Transfer Bean returned from the Gateway to a Bean I > created (call it "MyBean"). I want this for several reasons: > > 1) my View does not have to have knowledge of Transfer to retrieve values > from the Bean but can just call getters to retrieve values. > > 2) I can manipulate the values returned by Transfer before populating the > bean so instead of calling a getContent() on the bean which returns me a 255 > long string I can add a getShortContent() theat returns a max 55 character > string; > > 3) I can for example create a struct consisting of values located in > multiple related objects whereby I otherwise would have to put the Transfer > logic to retrieve these values in the view. For Example: ask a menu object > to "get me a menutitle based on language" where menuobject has a 12m > relation to menutitle object which has a m21 relation to language object. I > don't know how to do this without manually iterating through arrays of > Transfer objects and comparing values > > Currently I do this by copying the values from the transfer object to a new > bean and have that bean used by the View to display data. The new bean > contains the functions that provide the data I need in the form I need. > > Question 1: > Is this use of a custom Bean a good approach or am I better off using > decorators for the Transfer objects? > > My Service component looks like this (abbreviated): > > <cfcomponent accessors="true" name="myService"> > > <cfproperty name="DataBean"> > <cfproperty name="DataGateWay"> > > <cffunction name="get"> > <cfargument name="id"> > <cfset myBean=getDataBean()> > <cfset myTransferObject=getDataGateWay(arguments.id)> > <cfreturn getDataBean().populate(myTransferObject)> > </cffunction> > > I understand the dependency injection works like this: at > ApplicationStart() Coldspring injects an instance of a new DataBean in the > Service. Because I have the MG option "reloadBeanFactory" set to true in > development mode, every time I call function get() on the Page controller, > the service returns a new instance of the DataBean. But in production > "reloadBeanFactory" will be set to false so every request to PageController > returns the same instance of this populated Bean. > That will work fine when a requests ends displaying the contents of the > Bean before another request will populate the Bean. But what if request A is > in the process of displaying values from the Bean and then another request B > calls getDataBean().populate(myTransferObject)? Will the Bean suddenly start > returning values that are modified by the interrupting request B? > > Question 2 > Is this a credible scenario and if so, what are my options here? > > I hope this post is not too confusing. If so, just ask, I'll try to > clarify. > > Thanks, > > Marc > > -- > Model-Glue Sites: > Home Page: http://www.model-glue.com > Documentation: http://docs.model-glue.com > Bug Tracker: http://bugs.model-glue.com > Blog: http://www.model-glue.com/blog > > You received this message because you are subscribed to the Google > Groups "model-glue" 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/model-glue?hl=en -- Model-Glue Sites: Home Page: http://www.model-glue.com Documentation: http://docs.model-glue.com Bug Tracker: http://bugs.model-glue.com Blog: http://www.model-glue.com/blog You received this message because you are subscribed to the Google Groups "model-glue" 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/model-glue?hl=en
