tags:

views:

567

answers:

2

I know there have been similar questions on this topic but I wasn't completely sure they were solving the same problem. So just to be clear...

I have an existing class library that has namespaces for types, business logic and data access. The classes in the logic and data access namespaces are static and have basic crud methods to fill the type instances with data or take type instances that are already full and do inserts or updates in the database.

Now, in addition to the existing applications that reference this library directly, I want to also create a WCF service so that other applications can consume the objects and methods that way.

Every WCF turorial that I see creates the domain objects in the service project - but I don't want my objects defined in two places.

So I was thinking I could reference serialization in my existing class library and mark the type classes as [DataContract] and the properties as [DataMember]. Then, in the WCF project, create the [ServiceContract] interfaces with [OperationContract] methods to match the static logic classes and methods from the existing library that I want to expose. Then, from the WCF project, reference the existing class library and implement the WCF interfaces by having methods in it that call the existing library logic methods which return the existing library types.

Is this a good pattern?

+4  A: 

It sounds good but retrofitting serialization tends to be more trouble than it seems at first. I would suggest that you build some lightweight data contracts into a service layer and then build a small tier that sits between your service layer and the business layer to translate the data contracts into business objects and vice-versa.

Andrew Hare
+1  A: 

Assuming your business object can be serialized (have attribute Serializable) one approach could be creating DataContainer object, which will be your data contract. This object would be used in your CRUD methods.

For example your interface could be Update(DataContainer obj) Insert(DataContainer obj)

etc.

Then you would use Binary serialization to pack your object into array of bytes and pass it this way through WCF. On the other side you would deserialize them using again BinarySerialization. You just have to make sure that both sides (client and server) have valid version of assembly with your business objects types.

Maxim Alexeyev
Thanks Max. Actually I didn't mention it, but one of the things I am trying to do is not ship the library to the consumers of the service.
MarkB