Hola, en este post voy a intentar explicarles las diferentes formas que existen en SCSF/CAB para registrar y recuperar servicios. Empezemos 🙂
How To: Registrando Servicios
Existen dos formas de implementar la registracion de un servicio.
-
Usando el atributo [Service]
Este atributo nos indica que nuestra clase va a ser automaticamente registrada como un servicio dentro del root WorkItem de nuestra aplicacion.
Usage:
public interface IMyService
{
int GetSomeData();
}[Service(
typeof(IMyService))]
public class MyService : IMyService
{
public int GetSomeData()
{
return 1;
}
}Con el codigo anterior CAB crea una instancia de esta clase y la registra como un servicio durante el inicio de nuestra aplicacion. El parametro del constructor del atributo le esta a diciendo a CAB que key usar para registrar el servicio (para usarla en la localizacion)
Usando WorkItem.Services.Add<TService>()
Ahora bien, si queremos registrar nuestro servicio de una forma mas programatica, lo que tenemos que hacer es llamar al metodo Add o al metodo AddNew de la coleccion de servicios del WorkItem en el que queremos usar el servicio.Usage:
RootWorkItem.Services.Add<MyService>(myServiceInstance); RootWorkItem.Services.AddNew<MyService>();
RootWorkItem.Services.AddNew<MyService, IMyService>();
How To: Recuperando servicios
Ahora que ya tenemos nuestros servicios registrados, lo mas logico es que queramos recuperarlos para poder usarlos. Veamos las dos maneras que hay para realizarlo.
-
Usando el atributo [ServiceDependency]
Este atributo (que puede ser usando tanto en propiedades como en parametros) indica que esa propiedad o parametro es una dependencia a un servicio y el cual tiene que ser «inyectado» cuando el objeto es agregado a nuestro WorkItem.Usage:
private IMyService myService; [ServiceDependency]
public IMyService MyService
{
set { myService = value; }
}Con este codigo, CAB tiene claro que estamos teniendo una dependencia con IMyService, la cual ya fue creada y esta disponible para ser usada. Para realizar esto CAB usa Inversion of Control (IoC) / Dependency Injection (DI). Cuando el objeto (por ejemplo una View) es agregado al Workitem, la instancia que corresponda al servicio va a ser inyectada en nuestra propiedad o parametro.
- Usando WorkItem.Services.Get<TService>()
Por este camino la recuperacion del servicio es mas bajo demanda que usando el atributo [ServiceDependency].
Imaginemos que tenemos un segundo servicio llamado AnotherService que implementa la interface IAnotherService a la cual decoramos con el atributo [Service].
En nuestra View, no vamos a crear un propiedad para acceder a nuestro servicio, por lo tanto no vamos a estar usando el atributo [ServiceDependency].
Usage: (por ejemplo en un metodo)
public void MyMethod()
{
IAnotherService mySecondService = rootWorkItem.Services.Get<IAnotherService>();
// …
}Aclaremos que el atributo [ServiceDependency] no hace magia, sino que «behind the scenes» o en criollo por abajo, esta llamando a Services.Get.
Espero que esta guia les sea util.
Una explicacion muy concisa acerca de los servicios en aplicaciones smart client