|
|
|
|
@@ -978,7 +978,7 @@ them or copy their values to attached objects. This causes many lines of
|
|
|
|
|
|
|
|
|
|
<h2>Supplementary Answer:</h2>
|
|
|
|
|
|
|
|
|
|
<p>I prepared the sample application and posted in <a href="https://jira.springsource.org/browse/SPRNET-1431" rel="nofollow">SPRNET-1431 Workaround for 'conversation scope' and "session-per-conversation"</a> as the file "Spring.ConversationWA.example.7z".</p>
|
|
|
|
|
<p>I prepared the sample application and posted in <a href="https://jira.springsource.org/browse/SPRNET-1431" rel="nofollow">SPRNET-1431 Workaround for 'conversation scope' and "session-per-conversation"</a> as the file "Spring.Web.Conversation.example.7z".</p>
|
|
|
|
|
|
|
|
|
|
<p>Below, I wrote explanations to clarify (or not) what I did.</p>
|
|
|
|
|
|
|
|
|
|
@@ -1009,7 +1009,7 @@ keeps a cache of all loaded objects, if the conversation is held for a
|
|
|
|
|
long time this cache tends to grow indefinitely (the limit is the amount
|
|
|
|
|
of database records). That is, each conversation should be limited to a
|
|
|
|
|
subset of the application pages, and must be discarded at the end of
|
|
|
|
|
interaction with this subset (<code>IConversationState.EndConversation()</code>). Recommendation: Keep <code><property name="EndPaused" value="true"/></code> in "Spring.ConversationWA.Imple.WebConversationManager", so when start a conversation the others are discarded.</p>
|
|
|
|
|
interaction with this subset (<code>IConversationState.EndConversation()</code>). Recommendation: Keep <code><property name="EndPaused" value="true"/></code> in "Spring.Web.Conversation.WebConversationManager", so when start a conversation the others are discarded.</p>
|
|
|
|
|
|
|
|
|
|
<p>ADDITIONAL INFORMATION: The unit tests
|
|
|
|
|
("Spring.Northwind.IntegrationTests.2008") are not working. But there is
|
|
|
|
|
@@ -1030,7 +1030,7 @@ that. </p>
|
|
|
|
|
<li><p>module, added:
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="default prettyprint"><code><span class="tag"><add</span><span class="pln"> <br> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"ConversationModule"</span><span class="pln"> <br> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"Spring.ConversationWA.HttpModule.ConversationModule, Spring.ConversationWA"</span><span class="tag">/></span><span class="pln"> <br></span><span class="tag"><add</span><span class="pln"> <br> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"ConversationModule"</span><span class="pln"> <br> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"Spring.ConversationWA.HttpModule.ConversationModule, Spring.ConversationWA"</span><span class="tag">/></span><span class="pln"><br></span></code></pre></li>
|
|
|
|
|
<pre class="default prettyprint"><code><span class="tag"><add</span><span class="pln"> <br> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"ConversationModule"</span><span class="pln"> <br> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"Spring.Web.Conversation.HttpModule.ConversationModule, Spring.Web.Conversation"</span><span class="tag">/></span><span class="pln"> <br></span><span class="tag"><add</span><span class="pln"> <br> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"ConversationModule"</span><span class="pln"> <br> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"Spring.Web.Conversation.HttpModule.ConversationModule, Spring.Web.Conversation"</span><span class="tag">/></span><span class="pln"><br></span></code></pre></li>
|
|
|
|
|
<li><p>module, removed:
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
@@ -1046,11 +1046,11 @@ that. </p>
|
|
|
|
|
<li><p>conversation manager
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="default prettyprint"><code><span class="com"><!--Conversation Manager--></span><span class="pln"><br></span><span class="tag"><object</span><span class="pln"> <br> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"conversationManager"</span><span class="pln"> <br> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"Spring.ConversationWA.Imple.WebConversationManager, Spring.ConversationWA"</span><span class="pln"> <br> </span><span class="atn">scope</span><span class="pun">=</span><span class="atv">"session"</span><span class="tag">></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"SessionFactory"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"NHibernateSessionFactory"</span><span class="tag">/></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"EndPaused"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"true"</span><span class="tag">/></span><span class="pln"><br></span><span class="tag"></object></span><span class="pln"><br></span></code></pre></li>
|
|
|
|
|
<pre class="default prettyprint"><code><span class="com"><!--Conversation Manager--></span><span class="pln"><br></span><span class="tag"><object</span><span class="pln"> <br> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"conversationManager"</span><span class="pln"> <br> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"Spring.Web.Conversation.WebConversationManager, Spring.Web.Conversation"</span><span class="pln"> <br> </span><span class="atn">scope</span><span class="pun">=</span><span class="atv">"session"</span><span class="tag">></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"SessionFactory"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"NHibernateSessionFactory"</span><span class="tag">/></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"EndPaused"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"true"</span><span class="tag">/></span><span class="pln"><br></span><span class="tag"></object></span><span class="pln"><br></span></code></pre></li>
|
|
|
|
|
<li><p>Customer Conversation
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="default prettyprint"><code><span class="com"><!--<br> Conversation for 'CustomerEditor.aspx', 'CustomerList.aspx', <br> 'CustomerOrders.aspx', 'CustomerView.aspx', and 'FulfillmentResult.aspx'<br>--></span><span class="pln"><br></span><span class="com"><!--<br> Important: If the application had other parties<br> ("management employees" for example), they should use another <br> conversation.<br>--></span><span class="pln"><br></span><span class="tag"><object</span><span class="pln"> <br> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"convCustomer"</span><span class="pln"> <br> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"Spring.ConversationWA.Imple.WebConversationSpringState, Spring.ConversationWA"</span><span class="pln"> <br> </span><span class="atn">scope</span><span class="pun">=</span><span class="atv">"session"</span><span class="tag">></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"Id"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"convCustomer"</span><span class="tag">></property></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"TimeOut"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"0"</span><span class="tag">></property></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"ConversationManager"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"conversationManager"</span><span class="tag">></property></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"SessionFactory"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"NHibernateSessionFactory"</span><span class="tag">/></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"DbProvider"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"DbProvider"</span><span class="tag">/></span><span class="pln"><br> </span><span class="com"><!--<br> Using workaround for 'conversation scope' to reference for <br> 'CustomerEditController'. It is not as volatile as "request scope" <br> not as durable as the "session scope"<br> --></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"['CustomerEditController']"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"CustomerEditController"</span><span class="tag">></property></span><span class="pln"><br></span><span class="tag"></object></span><span class="pln"><br></span></code></pre></li>
|
|
|
|
|
<pre class="default prettyprint"><code><span class="com"><!--<br> Conversation for 'CustomerEditor.aspx', 'CustomerList.aspx', <br> 'CustomerOrders.aspx', 'CustomerView.aspx', and 'FulfillmentResult.aspx'<br>--></span><span class="pln"><br></span><span class="com"><!--<br> Important: If the application had other parties<br> ("management employees" for example), they should use another <br> conversation.<br>--></span><span class="pln"><br></span><span class="tag"><object</span><span class="pln"> <br> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"convCustomer"</span><span class="pln"> <br> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"Spring.Web.Conversation.WebConversationSpringState, Spring.Web.Conversation"</span><span class="pln"> <br> </span><span class="atn">scope</span><span class="pun">=</span><span class="atv">"session"</span><span class="tag">></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"Id"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"convCustomer"</span><span class="tag">></property></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"TimeOut"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"0"</span><span class="tag">></property></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"ConversationManager"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"conversationManager"</span><span class="tag">></property></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"SessionFactory"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"NHibernateSessionFactory"</span><span class="tag">/></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"DbProvider"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"DbProvider"</span><span class="tag">/></span><span class="pln"><br> </span><span class="com"><!--<br> Using workaround for 'conversation scope' to reference for <br> 'CustomerEditController'. It is not as volatile as "request scope" <br> not as durable as the "session scope"<br> --></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"['CustomerEditController']"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"CustomerEditController"</span><span class="tag">></property></span><span class="pln"><br></span><span class="tag"></object></span><span class="pln"><br></span></code></pre></li>
|
|
|
|
|
<li><p>Change "CustomerEditController" scope, remove [scope="session"] and put [singleton="false"]:
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
@@ -1068,7 +1068,7 @@ that. </p>
|
|
|
|
|
|
|
|
|
|
<pre class="lang-xml prettyprint"><code><span class="pln"> </span><span class="tag"><object</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"Default.aspx"</span><span class="tag">></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"Conversation"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"convDefault"</span><span class="tag">/></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"Results"</span><span class="tag">></span><span class="pln"><br> </span><span class="tag"><dictionary></span><span class="pln"><br> </span><span class="tag"><entry</span><span class="pln"> </span><span class="atn">key</span><span class="pun">=</span><span class="atv">"CustomerList"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"redirect:CustomerList.aspx"</span><span class="pln"> </span><span class="tag">/></span><span class="pln"><br> </span><span class="tag"></dictionary></span><span class="pln"><br> </span><span class="tag"></property></span><span class="pln"><br> </span><span class="tag"></object></span><span class="pln"><br></span></code></pre>
|
|
|
|
|
|
|
|
|
|
<pre class="lang-xml prettyprint"><code><span class="pln"> </span><span class="com"><!--Conversation for 'Default.aspx'--></span><span class="pln"><br> </span><span class="com"><!--<br> "convDefault" will have only one functionality: trigger the release<br> of other conversations when started (StartResumeConversation())<br> --></span><span class="pln"><br> </span><span class="tag"><object</span><span class="pln"><br> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"convDefault"</span><span class="pln"> <br> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"Spring.ConversationWA.Imple.WebConversationSpringState, Spring.ConversationWA"</span><span class="pln"><br> </span><span class="atn">scope</span><span class="pun">=</span><span class="atv">"session"</span><span class="tag">></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"Id"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"convDefault"</span><span class="tag">></property></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"TimeOut"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"0"</span><span class="tag">></property></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"ConversationManager"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"conversationManager"</span><span class="tag">></property></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"SessionFactory"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"NHibernateSessionFactory"</span><span class="tag">/></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"DbProvider"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"DbProvider"</span><span class="tag">/></span><span class="pln"><br> </span><span class="tag"></object></span><span class="pln"><br></span></code></pre>
|
|
|
|
|
<pre class="lang-xml prettyprint"><code><span class="pln"> </span><span class="com"><!--Conversation for 'Default.aspx'--></span><span class="pln"><br> </span><span class="com"><!--<br> "convDefault" will have only one functionality: trigger the release<br> of other conversations when started (StartResumeConversation())<br> --></span><span class="pln"><br> </span><span class="tag"><object</span><span class="pln"><br> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"convDefault"</span><span class="pln"> <br> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"Spring.Web.Conversation.WebConversationSpringState, Spring.Web.Conversation"</span><span class="pln"><br> </span><span class="atn">scope</span><span class="pun">=</span><span class="atv">"session"</span><span class="tag">></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"Id"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"convDefault"</span><span class="tag">></property></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"TimeOut"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"0"</span><span class="tag">></property></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"ConversationManager"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"conversationManager"</span><span class="tag">></property></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"SessionFactory"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"NHibernateSessionFactory"</span><span class="tag">/></span><span class="pln"><br> </span><span class="tag"><property</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"DbProvider"</span><span class="pln"> </span><span class="atn">ref</span><span class="pun">=</span><span class="atv">"DbProvider"</span><span class="tag">/></span><span class="pln"><br> </span><span class="tag"></object></span><span class="pln"><br></span></code></pre>
|
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
<li>Added "ConversationPage.cs". Base page with support for conversation.</li>
|
|
|
|
|
@@ -1117,7 +1117,7 @@ IDbCommand execution. This is important because we will do more lazyload
|
|
|
|
|
<li><p>Config\Log4Net.xml.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="default prettyprint"><code><span class="pun">...</span><span class="pln"><br></span><span class="pun"><!--</span><span class="pln">detail</span><span class="str">'s about SQL'</span><span class="pln">s</span><span class="pun">.</span><span class="pln"> </span><span class="typ">To</span><span class="pln"> view sql commands on </span><span class="typ">Logs</span><span class="pun">\</span><span class="pln">log</span><span class="pun">.</span><span class="pln">txt</span><span class="pun">--></span><span class="pln"><br></span><span class="pun"><</span><span class="pln">logger name</span><span class="pun">=</span><span class="str">"NHibernate.SQL"</span><span class="pun">></span><span class="pln"><br> </span><span class="pun"><</span><span class="pln">level value</span><span class="pun">=</span><span class="str">"DEBUG"</span><span class="pln"> </span><span class="pun">/></span><span class="pln"><br></span><span class="pun"><</span><span class="str">/logger><br>...<br><!--detail's about Conversation--><br><logger name="Spring.ConversationWA"><br> <level value="DEBUG" /</span><span class="pun">></span><span class="pln"><br></span><span class="pun"></</span><span class="pln">logger</span><span class="pun">></span><span class="pln"><br></span></code></pre></li>
|
|
|
|
|
<pre class="default prettyprint"><code><span class="pun">...</span><span class="pln"><br></span><span class="pun"><!--</span><span class="pln">detail</span><span class="str">'s about SQL'</span><span class="pln">s</span><span class="pun">.</span><span class="pln"> </span><span class="typ">To</span><span class="pln"> view sql commands on </span><span class="typ">Logs</span><span class="pun">\</span><span class="pln">log</span><span class="pun">.</span><span class="pln">txt</span><span class="pun">--></span><span class="pln"><br></span><span class="pun"><</span><span class="pln">logger name</span><span class="pun">=</span><span class="str">"NHibernate.SQL"</span><span class="pun">></span><span class="pln"><br> </span><span class="pun"><</span><span class="pln">level value</span><span class="pun">=</span><span class="str">"DEBUG"</span><span class="pln"> </span><span class="pun">/></span><span class="pln"><br></span><span class="pun"><</span><span class="str">/logger><br>...<br><!--detail's about Conversation--><br><logger name="Spring.Web.Conversation"><br> <level value="DEBUG" /</span><span class="pun">></span><span class="pln"><br></span><span class="pun"></</span><span class="pln">logger</span><span class="pun">></span><span class="pln"><br></span></code></pre></li>
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<p>Hailton de Castro.</p>
|
|
|
|
|
|