If you call business logic a project that performs mapping of your database tables to Sharpov classes, then you are mistaken. This is not business logic, it is just a projection of database tables. Of course, there is no need to edit these classes in any way, let alone add the DataContact attributes to them. In any case, your layers (links, as you call them) should have the smallest possible level of connectivity with each other. These layers should interact with each other through some open interfaces, and be a separate module, any of which can be replaced without serious consequences by some other, without destroying the entire architecture. In other words, your business logic should not know anything at all about either the WCF project or the ASP.NET MVC project. WCF, in turn, should not know anything about ASP.NET MVC, and should not be tightly tied to specifically this layer of business logic (that is, business logic must provide a certain set of access points that WCF can use, while replacing your layer business logic on the other, with similar access points, should be painless). In this way, you will ease your life when changing, expanding and testing the project and get rid of the need to write crutches at the slightest lead. From this it follows that only WCF should work with DataContract, since DataContract is needed to serialize your data, and only WCF service needs serialization. The underlying layers (business logic, data layer) do not know anything about serialization, and therefore should not see it. The less you know - sleep tight, as you know. Since your WCF service will transfer some data to the outside, and it will obviously be taken from business logic, it will need to somehow serialize this data for the correct transfer. This is where DataContract comes in. You will need to create a class (or classes) with this attribute that will be used to serialize data from business logic. Moreover, it is far from necessary that these classes be full projections of each class from business logic, most likely it will not be necessary, otherwise you will get almost complete duplication of code. However, in general, some kind of duplication cannot be avoided, because it’s still not worth mixing serialization and business logic, these are different things, and they must be separated into different layers of your application.