Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add CachingConnectionFactory to docs.
add wcf quickstart
- Loading branch information
markpollack
committed
Aug 14, 2008
1 parent
299f801
commit f595ed9
Showing
2 changed files
with
227 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,165 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<chapter id="wcf-quickstart"> | ||
<title>WCF QuickStart</title> | ||
|
||
<section> | ||
<title>Introduction</title> | ||
|
||
<para>The WCF quickstart application shows how to configure your WCF | ||
services using dependency injection and how to to apply AOP advice to your | ||
services. It is based on the same interfaces used in the <link | ||
linkend="remoting-quickstart">portable service abstractions | ||
quickstart</link> example that demonstrates similar features for .NET | ||
Remoting, Enterprise Services, and ASMX web sevices. At the moment the | ||
quickstart example is only available as a VS.NET 2008 solution.</para> | ||
|
||
<para>There are two server applications in the solution, one is a web | ||
application where the WCF service will be hosted, and the other is a | ||
self-hosting console application, (Spring.WcfQuickStart.Server.2008. The | ||
client application is located in Sprng.WcfQuickStart.ClientApp.2008. To | ||
run the solution make sure that all three projects are set to | ||
startup.</para> | ||
</section> | ||
|
||
<section> | ||
<title>The server side</title> | ||
|
||
<para>The service contract is shown below</para> | ||
|
||
<programlisting> [ServiceContract(Namespace = "http://Spring.WcfQuickStart")] | ||
public interface ICalculator | ||
{ | ||
[OperationContract] | ||
double Add(double n1, double n2); | ||
[OperationContract] | ||
double Subtract(double n1, double n2); | ||
[OperationContract] | ||
double Multiply(double n1, double n2); | ||
[OperationContract] | ||
double Divide(double n1, double n2); | ||
[OperationContract] | ||
string GetName(); | ||
}</programlisting> | ||
|
||
<para>and the implementation is straightforward, only adding a property | ||
that controls how long each method should sleep. An abbreviated listing of | ||
the implementation is shown below </para> | ||
|
||
<programlisting> public class CalculatorService : ICalculator | ||
{ | ||
private int sleepInSeconds; | ||
|
||
public int SleepInSeconds | ||
{ | ||
get { return sleepInSeconds; } | ||
set { sleepInSeconds = value; } | ||
} | ||
|
||
public double Add(double n1, double n2) | ||
{ | ||
Thread.Sleep(sleepInSeconds*1000); | ||
return n1 + n2; | ||
} | ||
|
||
|
||
// other methods omitted for brevity. | ||
|
||
}</programlisting> | ||
|
||
<section> | ||
<title>DI using dynamic proxies</title> | ||
|
||
<para>The approach using dynamic proxies is used in the console | ||
application inside the Spring.WcfQuickStart.Server.2008 project. For | ||
more information on this approach refer to this <link | ||
linkend="wcf-di-proxy">section</link> in the reference docs. The | ||
configuration of your service is done as you would typically do with | ||
Spring, including applying of any AOP advice. The class is hosted inside | ||
the console application through the use of Spring's | ||
<classname>ServiceHostFactoryObject</classname> exporter. The | ||
configuration for the server console application is shown below. </para> | ||
|
||
<programlisting> <objects xmlns="http://www.springframework.net" | ||
xmlns:aop="http://www.springframework.net/aop"> | ||
|
||
<!-- Service definition --> | ||
<object id="calculator" singleton="false" | ||
type="Spring.WcfQuickStart.CalculatorService, Spring.WcfQuickStart.ServerApp"> | ||
<property name="SleepInSeconds" value="1"/> | ||
</object> | ||
|
||
<object id="serviceOperation" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop"> | ||
<property name="pattern" value="Spring.WcfQuickStart.*"/> | ||
</object> | ||
|
||
<object id="perfAdvice" type="Spring.WcfQuickStart.SimplePerformanceInterceptor, Spring.WcfQuickStart.ServerApp"> | ||
<property name="Prefix" value="Service Layer Performance"/> | ||
</object> | ||
|
||
<aop:config> | ||
<aop:advisor pointcut-ref="serviceOperation" advice-ref="perfAdvice"/> | ||
</aop:config> | ||
|
||
<!-- host the service object --> | ||
<object id="calculatorServiceHost" type="Spring.ServiceModel.Activation.ServiceHostFactoryObject, Spring.Services"> | ||
<property name="TargetName" value="calculator" /> | ||
</object> | ||
|
||
</objects></programlisting> | ||
|
||
<para>Look at the standard WCF configuration section in App.config for | ||
additional configuration details. In that section you will see that the | ||
name of the WCF service corresponds to the name of the service object | ||
inside the spring container.</para> | ||
</section> | ||
|
||
<section> | ||
<title>DI using WCF extension points</title> | ||
|
||
<para>This approach uses Spring specific implementation of the WCF | ||
interfaces | ||
<classname>System.ServiceModel.Dispatcher.IInstanceProvider</classname> | ||
and | ||
<classname>System.ServiceModel.Description.IServiceBehavior</classname> | ||
are used to integrate Spring directly into the instancing of WCF | ||
services. For more information on this approach refer to this <link | ||
linkend="wcf-di-extension-points">section</link> of the reference | ||
documentation. The web application shows this approach in action.</para> | ||
|
||
<para>Much of the configuration ob the objects is the same as before, | ||
the .svc file though refers to the type of the service inside the Spring | ||
container as well as using Spring's | ||
Spring.ServiceModel.Activation.ServiceHostFactory. The .svc file is | ||
shown below.</para> | ||
|
||
<programlisting><%@ ServiceHost Language="C#" Debug="true" Service="Spring.WcfQuickStart.CalculatorService" | ||
Factory="Spring.ServiceModel.Activation.ServiceHostFactory" %> | ||
</programlisting> | ||
</section> | ||
</section> | ||
|
||
<section> | ||
<title>Client access </title> | ||
|
||
<para>The project Spring.WcfQuickStart.ClientApp.2008 is a console | ||
application that calls the two WCF services. It creates a client side | ||
proxy based on using ChannelFactory<T>.CreateChannel. Running the | ||
client application produces the following output.</para> | ||
|
||
<programlisting>--- Press <return> to continue --- | ||
Web Calculator | ||
Add(1, 1) : 2 | ||
Divide(11, 2) : 5.5 | ||
Multiply(2, 5) : 10 | ||
Subtract(7, 4) : 3 | ||
|
||
ServerApp Calculator | ||
Add(1, 1) : 2 | ||
Divide(11, 2) : 5.5 | ||
Multiply(2, 5) : 10 | ||
Subtract(7, 4) : 3 | ||
|
||
--- Press <return> to continue --- | ||
</programlisting> | ||
</section> | ||
</chapter> |