На работе мне приходится работать с WCF, и глядя на то что пишут коллеги, и заинтересовался вот таким вопросом:
Намеренно ли в WCF разделены данные и методы? Как правило, атрибуты [DataContract]/[DataMember] накладываются на одни классы, а [ServiceContract]/[OperationContract] — на другие. В результате все пишут некие обработчики или хелпер-классы, которые экспозят методы, оперирующие над классами данных.
Нет ли практики писать "активные" классы, которые совмещали бы в себе и то и другое?
То есть вместо:
var client = ClientFactory<T>.CreateClient("net.tcp://localhost:8052/MyService"); // create service contract object
var data = new SomeDataContract(); // create data contract object
client.DoSomething(data); // execute operation contract on data contract
писать примерно следующее:
var activeObject = new SomeOperationAndDataContract("net.tcp://localhost:8052/MyService"); // create an object which is data and service contract
activeObject.DoSomething(); // execute operation contract
Здравствуйте, Аноним, Вы писали:
А>Ну в общем-то имеется ввиду сам класс службы, тот, который помечается атрибутами [ServiceContract]/[OperationContract]
Так он не вспомогательный. Он — основной.
Вообще да, так сделано преднамеренно, в соответсвии c
SOA.
З.Ы. В общем случае использование сервиса не всегда означает использование какого-либо контракта данных:
public interface ILightBulbService()
{
// turns light bulbs on or off
void SetLightBulbState(Boolean[] state);
// requests current state
Boolean[] GetLightBulbState();
}
Сервис есть, контракт сервиса — есть, специально описанного контракта данных нет.