Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cómo utiliza wcf los constructores para la inyección de dependencias?

¿Cómo utiliza wcf los constructores para la inyección de dependencias?

Los pasos son los siguientes:

I. Implementar la interfaz IInstanceProvider - IocInstanceProvider

1. Crear una nueva clase IocInstanceProvider que implemente la interfaz IInstanceProvider.

2. Implemente los tres métodos de la interfaz IInstanceProvider e introduzca su propio contenedor IoC (por ejemplo, usamos CNBlogs.Infrastructure.CrossCutting.IoC), lo que permite a WCF obtener servicios WCF a través de su instancia de contenedor IoC. . El código de muestra es el siguiente:

clase pública IocInstanceProvider: IocInstanceProvider

{

Tipo _serviceType;

IContainer _container;

public IocInstanceProvider(Tipo serviceType)

{

_serviceType = serviceType;

_container = CNBlogs.Infrastructure.CrossCutting.IoC.

IoCFactory.Instance.CurrentContainer;

}

#región miembros IInstanceProvider

objeto público GetInstance(InstanceContextstanceContext, mensaje mensaje)

{

return _container.Resolve(_serviceType);

}

objeto público GetInstance(InstanceContextstanceContext)

{

return GetInstance(instanceContext, null);

}

public void ReleaseInstance(InstanceContextstanceContext, instancia de objeto)

{

if (la instancia es IDisposable)

( ( IDisposable)instancia).Dispose();

}

#endregion

}

Nota: Su contenedor de IoC debe tener inyectada de antemano la instancia de servicio WCF adecuada. Por ejemplo, nuestra inyección:

container.RegisterType();

Donde IBlogService es la interfaz del servicio WCF y BlogService es la implementación del servicio WCF.

II.Implemente la interfaz IServiceBehavior - IocServiceBehavior

1. Cree una nueva clase IocServiceBehavior, herede de Attribute e implemente IServiceBehavior

clase pública IocServiceBehavior: Attribute, IServiceBehavior.

2. Implemente el método AddBindingParameters() de IServiceBehavior e introduzca el IocInstanceProvider creado previamente

clase pública IocServiceBehavior: Attribute, IServiceBehavior

{

#región miembro IServiceBehavior

public void AddBindingParameters(ServiceDescription serviceDescription,

ServiceHostBase serviceHostBase,

Collection< ServiceEndpoint> puntos finales,

BindingParameterCollection junctionParameters)

{

foreach (var elemento en serviceHostBase.ChannelDispatchers)

{

var despachador = elemento como ChannelDispatcher ;

if (dispatcher != null)

{

despachador.Endpoints.ToList().ForEach(endpoint =>

{

endpoint.DispatchRuntime.InstanceProvider = nuevo

IocInstanceProvider(serviceDescription.ServiceType);

});

}

}

}

}

public void ApplyDispatchBehavior(ServiceDescription serviceDescription,

ServiceHostBase serviceHostBase)

{

}

validar public void(ServiceDescription serviceDescription,

ServiceHostBase serviceHostBase)

{

}

#endregion

}

En tercer lugar, agregue el atributo [IocServiceBehavior] en la clase de implementación del servicio WCF

El código es el siguiente:

[IocServiceBehavior]

BlogService de clase pública: IBlogService

{

IBlogSiteService privado _blogSiteService

>

public BlogService(IBlogSiteService blogSiteService)

{

_ blogSiteService = blogSiteService

}

#región miembro de IBlogService<; /p>

public BlogSiteDto GetBlogSiteWithPosts(int blogId,

bool withPostBody, int itemcount)

{

return _blogSiteService.GetWithPosts(blogId,

p>

withPostBody, itemcount);

}

#endregion

}

¡Listo! ¡No es tan simple!

El código de implementación anterior se refiere a la aplicación de muestra .NET 4.0 de N niveles orientada a dominios (/). Si está interesado en DDD, le recomendamos que lea el código de este proyecto.

Mejoras de código

De acuerdo con las sugerencias de Artech y haciendo referencia a WCF Extensibility - IInstanceProvider, mejoramos el código de IocServiceBehavior e implementamos la interfaz ApplyDispatchBehavior. El código es el siguiente:

clase pública IocServiceBehavior: Atributo, IServiceBehavior

{

#región Miembros de IServiceBehavior

public void AddBindingParameters(ServiceDescription serviceDescription,

ServiceHostBase serviceHostBase ,

Colección< ServiceEndpoint> puntos finales,

BindingParameterCollection (bindingParameters)

{

}

público void ApplyDispatchBehavior (ServiceDescription serviceDescription,

ServiceHostBase serviceHostBase)

{

foreach (CD de ChannelDispatcher en serviceHostBase.ChannelDispatchers)

{

foreach (EndpointDispatcher ed en cd.Endpoints)

{

if (!ed.IsSystemEndpoint)

{

ed .DispatchRuntime.InstanceProvider =

nuevo IocInstanceProvider(serviceDescription.ServiceType);

}

}

}

public void Validate(ServiceDescription serviceDescription,

ServiceHostBase serviceHostBase)

{

}

#endregion

}