我試圖將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