REST WCFサービス(Windows Server 2008)にIoCサポートを追加しようとしています。私はこれに新しいですし、下のビデオで提供される指示に従っています:WCFサービスにIoCサポートを追加しようとしています
http://www.dimecasts.net/Content/WatchEpisode/150
ビデオは私がのStructureMapのIoCのアップとWCFエンドポイントを露出させながら実行する手助けクラスの数をウォークスルー。私はこの記事の最後にすべてのコードを掲載しました。
私は私のコードを実行すると、カスタムクラスStructureMapServiceHostは、メソッド(ウリは[] BASEADDRESS paramsは、型サービス種別)StructureMapServiceHost @エラーがスローされます:
:
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);
}
}
アイデアはありますか?ありがとう。 *
EDIT * ** * ** * ** * ** * ** * ** * ** * ** * * * ****
投稿者: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.
おかげフョードル。私はあなたが提案したことを試して、新しいエラーを得ました。私の上のEDITを見てください。私が間違っていることを教えてくれますか?コードイラストはこの時点で助けになるかもしれません。 –
@Code Sherpa:あなたのブラウザでそのサービスにアクセスして、それがどのようなエラーを表示するかを確認してください。 –
こんにちはFydor - 私は取得しています:リソースが見つかりません。 説明:HTTP 404。探しているリソース(またはその依存関係の1つ)が削除されているか、名前が変更されているか、一時的に使用できない可能性があります。次のURLを確認し、正しく入力されていることを確認してください。 リクエストされたURL:/Users.svc/users –