Я пытаюсь добавить поддержку IoC в свою службу REST WCF (Windows Server 2008 ). Я новичок в этом и следую инструкциям, приведенным в следующем видео:
http://www.dimecasts.net/Content/WatchEpisode/150
В видео рассматривается ряд классов, которые помогают мне получить StructureMap ' ■ IoC запущен и работает, открывая доступ к конечным точкам WCF. Я разместил весь код в конце этого сообщения.
Когда я запускаю свой код, пользовательский класс StructureMapServiceHost выдает ошибку @ метод StructureMapServiceHost (Type serviceType, params Uri [] baseAddress):
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();
}
}
Я сообщается, что:
Указанный тип службы не может быть загружен как служба, поскольку у него нет конструктора по умолчанию (без параметров). Чтобы решить эту проблему, добавьте к типу конструктор по умолчанию или передайте экземпляр типа хосту.
Это правда, это не так. Но и в видео-примере его не было. Ниже мой сервис:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class UserService : IUserService
{
public UserService(IUserRepository specification)
{
Specification = specification;
}
public List GetAllUsers()
{
return Specification.GetAllUsers();
}
public User GetUser(string userId)
{
return Specification.GetUserById(new Guid(userId));
}
private List 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 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);
}
}
Есть идеи? Спасибо.
ИЗМЕНИТЬ * ** * ** * ** * ** * ** * ** * ** * ** * ** * ****
От StructureMapServiceHost Я удалил:
public StructureMapServiceHost(Type serviceType, params Uri[] baseAddress)
: base(serviceType, baseAddress) { }
И добавил:
public StructureMapServiceHost(Object singletonInstance, params Uri[] baseAddress)
: base( singletonInstance, baseAddress) { }
А затем удалил параметр из моего конструктора UserService. Я не получаю сообщение об ошибке:
HTML-документ не содержит Web информация об обнаружении службы.