我试图将IoC支持添加到我的REST WCF服务(Windows Server 2008)。我是新来这和我跟随在下面的视频中提供的说明:试图将IoC支持添加到我的WCF服务
http://www.dimecasts.net/Content/WatchEpisode/150
视频走过了许多有助于我StructureMap的IoC起来,而露出WCF端点上运行的类。我在本帖末尾发布了所有代码。
当我运行我的代码,自定义类StructureMapServiceHost抛出一个错误@的StructureMapServiceHost(类型的serviceType,则params乌里[] 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<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);
}
}
任何想法?谢谢。
编辑* ** * ** * ** * ** * ** * ** * ** * ** * * * * ****
从StructureMapServiceHost我删除了:
public StructureMapServiceHost(Type serviceType, params Uri[] baseAddress)
: base(serviceType, baseAddress) { }
并补充说:
public StructureMapServiceHost(Object singletonInstance, params Uri[] baseAddress)
: base(singletonInstance, baseAddress) { }
,然后取出从我UserService构造函数中的参数。我没有得到错误:
The HTML document does not contain Web service discovery information.
由于陀。我尝试了你的建议并得到一个新的错误。请参阅上面的我的编辑。你能告诉我我做错了什么吗?代码插图可能有助于在这一点...非常感谢。 – 2011-01-19 18:45:47
@Code Sherpa:尝试使用浏览器访问该服务,并查看它给您带来的错误。 – 2011-01-19 19:56:59