Estoy intentando agregar compatibilidad con IoC a mi servicio REST WCF (Windows Server 2008). Soy nuevo en esto y estoy siguiendo las instrucciones proporcionadas en el vídeo a continuación:Intentando agregar compatibilidad con la IoC a los servicios de WCF
http://www.dimecasts.net/Content/WatchEpisode/150
El vídeo guía a través de una serie de clases que me ayude a conseguir de StructureMap COI en funcionamiento, mientras que la exposición de los puntos finales de WCF. He publicado todo el código al final de esta publicación.
Cuando ejecuto mi código, el StructureMapServiceHost clase personalizada genera un error @ el StructureMapServiceHost (tipoServicio Tipo, params Uri [] baseAddress) Método:
public class StructureMapServiceHost : ServiceHost
{
public StructureMapServiceHost() {}
public StructureMapServiceHost(Type serviceType, params Uri[] baseAddress)
: base(serviceType, baseAddress)
{
}
protected override void OnOpening()
{
Description.Behaviors.Add(new IoCServiceBehavior());
base.OnOpening();
}
}
me están dijo que:
El tipo de servicio proporcionado no se pudo cargar como un servicio porque no tiene un constructor predeterminado (sin parámetros). Para solucionar el problema, agregue un constructor predeterminado al tipo o pase una instancia del tipo al host.
Esto es cierto, no es así. Pero el ejemplo de video tampoco tenía ninguno. Debajo está mi servicio:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class UserService : IUserService
{
public UserService(IUserRepository specification)
{
Specification = specification;
}
public List<User> GetAllUsers()
{
return Specification.GetAllUsers();
}
public User GetUser(string userId)
{
return Specification.GetUserById(new Guid(userId));
}
private List<User> SearchForUsers(string searchString)
{
return Specification.SearchUsers(searchString);
}
public IUserRepository Specification { get; set; }
}
public class IoCServiceBehavior : IServiceBehavior
{
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase,
Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers)
{
new StructureMapInstanceProvider(serviceDescription.ServiceType);
}
}
}
public class StructureMapInstanceProvider : IInstanceProvider
{
private readonly Type _serviceType;
public StructureMapInstanceProvider(Type serviceType)
{
_serviceType = serviceType;
}
public object GetInstance(InstanceContext instanceContext)
{
return GetInstance(instanceContext, null);
}
public object GetInstance(InstanceContext instanceContext, Message message)
{
var instance = ObjectFactory.GetInstance(_serviceType);
return instance;
}
public void ReleaseInstance(InstanceContext instanceContext, object instance)
{
throw new NotImplementedException();
}
}
public class StructureMapServiceHostFactory : ServiceHostFactory
{
public StructureMapServiceHostFactory()
{
IoCBootstrap.SetupIoc();
}
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
return new StructureMapServiceHost(serviceType, baseAddresses);
}
}
¿Alguna idea? Gracias.
EDITAR * ** * ** * ** * ** * ** * ** * ** * ** * * * * ****
De StructureMapServiceHost Eliminé:
public StructureMapServiceHost(Type serviceType, params Uri[] baseAddress)
: base(serviceType, baseAddress) { }
y ha añadido:
public StructureMapServiceHost(Object singletonInstance, params Uri[] baseAddress)
: base(singletonInstance, baseAddress) { }
y luego se retira el parámetro de mi constructor UserService. No estoy recibiendo el error:
The HTML document does not contain Web service discovery information.
Gracias Fedor. He intentado lo que sugirió y obtuve un nuevo error. Por favor mira mi EDIT arriba. ¿Puedes decirme qué estoy haciendo mal? La ilustración del código podría ayudar en este punto ... muy apreciada. –
@Code Sherpa: intente acceder a ese servicio con su navegador y vea qué error le da. –
Hola Fydor - Estoy obteniendo: El recurso no se puede encontrar. Descripción: HTTP 404. El recurso que está buscando (o una de sus dependencias) podría haberse eliminado, haber cambiado su nombre o no estar disponible temporalmente. Revise la siguiente URL y asegúrese de que esté escrita correctamente. URL solicitada: /Users.svc/users –