Es realmente todo tiene que ver con una arquitectura orientada a servicios - algo que ha sido común durante un tiempo y es muy popular.
La idea es que las distintas operaciones se desacoplen entre sí para que puedan ser reutilizadas y modificadas sin volver a compilar las aplicaciones que lo utilizan. En lugar de una pieza de código en una DLL que se está modificando y copiando en todas partes, se puede implementar un servicio que represente un único punto de acceso para una pieza particular de procesamiento o fuente de información.
Supongamos que tiene un componente de validación de tarjeta de crédito. Puede escribir este código y compilarlo en una DLL y comenzar a incluir eso en todas sus aplicaciones. No hay problema con eso a menos que notes un error o cambien las reglas para la validación de CC. O tal vez desea actualizarlo para verificarlo contra una lista negra. No puede hacer ninguna de esas cosas sin recompilar las aplicaciones que lo usan.
Sin embargo, si la validación de su tarjeta de crédito está expuesta como un servicio, puede realizar los cambios e implementarla en una ubicación. Siempre que la firma sea la misma (los mismos parámetros y respuesta), las aplicaciones ni siquiera tienen que saber que ha cambiado.
Otra ventaja de usar servicios sobre componentes es que los servicios pueden alojarse en cualquier lugar. Pueden estar en el servidor local o en el otro lado del mundo.
Habiendo dicho esto, como todo lo que debe decidir la arquitectura caso por caso. Si bien la validación de la tarjeta de crédito fue un buen ejemplo de cuándo un servicio es útil, proporcionar un servicio para representar controles HTML no tiene mucho sentido.
Bueno, en el caso de Silverlight, su UI/aplicación se ejecuta en el equipo cliente dentro o fuera del navegador, mientras que su lógica comercial está en un servidor remoto. Realmente no se puede hacer esto usando componentes de clic, los servicios (cruzar los límites de la máquina) son realmente la única manera de hacerlo aquí. –