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

Reply via email to