tags:

views:

335

answers:

3

Hi,

I'm trying to implement a WCF Service in my program , howevery I don't understand something:

According to the book "Programming WCF Services" , Juval Löwy 2007 O'Reilly Media,. Appendix C. - WCF Coding Standard C2 - Essential : 1. Place service code in a class library and not in any hosting EXE.

I don't understand this, where should I put my code? all my class are defined in my form application , How should I call my classes of the winforms from the Class Library of the service.

Am I missing here something??

Thanks, Eyal

A: 

Here's a typical project structure following Löwy's recommendation:

MyProject.Data
MyProject.Logic
MyProject.Services
MyProject.ServiceHosts
MyProject.Presentation

Then MyProject.ServiceHosts will reference MyProject.Services and exposes the services defined there. So in Löwy's language, MyProject.Services is the class library, and MyProject.ServiceHosts contains the hosting executable.

Jason
+1  A: 

Yes, it's a bit confusing.

We're talking about the service implementation here. What Loewy means here is that the code to implement the service should be in a separate project. The code that hosts the WCF service (i.e. the class that implements your service contract) should do nothing but call that service implementation code.

So your Windows Forms client application uses a proxy, which in turn calls the WCF service application hosting layer, which in turn calls your service logic.

It's a very good idea to go further and have three layers on the UI side and four on the service side. The namespaces might be

Company.Project.UI.WinForms
Company.Project.UI
Company.Project.ServiceClient

Company.Project.ServiceHost
Company.Project.Service
Company.Project.BusinessLogic
Company.Project.Persistence

For simpler projects this would be overkill, but for anything more than (say) one form or two service methods it will make life much easier. Not least, testing each layer in isolation should be fairly straightforward.

Jeremy McGee
Ok, Thanks for the explanation, what is Company.Project.Persistence layer for ?
Eyalk
Database storage, or similar. It might call another service - I've written plenty of services that call services for persistence recently rather than doing database work directly.
Jeremy McGee
And also: per @Jason, it's important to make sure that each layer references only the one below it. An IoC framework like Spring.NET or Castle Windsor can really help there.
Jeremy McGee
ah ha , good point :)
Eyalk
BTW - what is Castle Windsor ?
Eyalk
It's an inversion of control container: http://en.wikipedia.org/wiki/Inversion_of_control
Jason
Here's Castle Windsor itself: http://www.castleproject.org/container/index.html
Jeremy McGee
+1  A: 

I like to structure my WCF solutions like this:

YourProject.Contracts (class library)
Contains all the service, operations, fault, and data contracts. Can be shared between server and client in a pure .NET-to-.NET scenario

YourProject.Service (class library)
Contains the code to implement the services, and any support/helper methods needed to achieve this. Nothing else.

YourProject.ServiceHost (optional - can be Winforms, Console App, NT Service)
Contains service host(s) for debugging/testing, or possibly also for production.

This basically gives me the server-side of things.

On the client side:

YourClient.ClientProxies (class library)
I like to package my client proxies into a separate class library, so that they can be reused by multiple actual client apps. This can be done using svcutil or "Add Service Reference" and manually tweaking the resulting horrible app.config's, or by doing manual implementation of client proxies (when sharing the contracts assembly) using ClientBase<T> or ChannelFactory<T> constructs.

1-n actual clients (any type of app)
Will typically only reference the client proxies assembly, or maybe the contracts assembly, too, if it's being shared. This can be ASP.NET, WPF, Winforms, console app, other services - you name it.

That way; I have a nice and clean layout, I use it consistently over and over again, and I really think this has made my code cleaner and easier to maintain.

This was inspired by Miguel Castro's Extreme WCF screen cast on DotNet Rocks TV with Carl Franklin - highly recommended screen cast !

marc_s
Yes, breaking out the contracts to a different assembly so they can be re-used makes lots of sense.
Jeremy McGee