¿Cómo utiliza wcf los constructores para la inyección de dependencias?
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 p>
}
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
{ p >
#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);
});
} p>
}
}
}
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>
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)
{ p>
foreach (EndpointDispatcher ed en cd.Endpoints)
{
if (!ed.IsSystemEndpoint)
{
ed .DispatchRuntime.InstanceProvider =
nuevo IocInstanceProvider(serviceDescription.ServiceType);
}
}
}
public void Validate(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{
}
#endregion
}