1

WCF を介していくつかの機能を公開する必要がある MVC3 アプリケーションがあります。これらの関数の一部には依存関係があり、Ninject を使用してそれらを注入したいのですが、これが機能しないため、ここで明らかな何かが欠けているに違いありません。誰でもヒントを与えることができますか?これが私がしたことです:

1) MVC3 アプリで、ナゲット経由でNinject Wcf 拡張機能を追加します。

2) 次のような.svc ファイルを追加します。

<%@ ServiceHost Service="MyWeb.LookupService" 
  Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory"%>

3)次のような対応するコードを追加します(これは単なるテストなので、ここではダミーのインターフェースを使用しています):

[ServiceContract]
public interface ILookupService
{
    [OperationContract]
    int GetProjectIdByCode(string sCode);
}

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class LookupService : ILookupService
{
  private readonly ISomeRepository _repository;
  public LookupService(ISomeRepository repository)
  {
    _repository = repository;
  }

  public int GetProjectIdByCode(string sCode)
  {
    //... use _repository
  }
}

4) App_Start/ NinjectMVC3.csで:

private static void RegisterServices(IKernel kernel)
{
    string sConnection = ConfigurationManager.ConnectionStrings["SomeEntities"].ConnectionString;
    // WCF
    kernel.Bind<ServiceHost>().To<NinjectServiceHost>();

    kernel.Bind<ISomeRepository>()
        .To<AConcreteRepository>()
        .WithConstructorArgument("sConnection", sConnection);
}

ここで、svc にアクセスすると、Ninject から次の例外が発生します。

System.ArgumentNullException はユーザー コードによって処理されませんでした
Message=Cannot be null パラメータ名: ルート ソース=Ninject
ParamName=ルート2\ninject\src\Ninject\Infrastructure\Ensure.cs: 20 行目 Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot root、Type service、Func2 constraint, IEnumerable1 つのパラメーター、Boolean isOptional、Boolean isUnique) の c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Syntax\ResolutionExtensions.cs:Ninject.ResolutionExtensions.Get[T](IResolutionRoot ルート、IParameter[ ] parameters) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Syntax\ResolutionExtensions.cs:line 37 at Ninject.Extensions.Wcf.NinjectServiceHostFactory.CreateServiceHost(Type serviceType, Uri[] baseAddresses) in c :\Projects\Ninject\Maintenance2.2\ninject.extensions.wcf\src\Ninject.Extensions.Wcf\NinjectServiceHostFactory.cs:System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString, Uri[] baseAddresses) の 48 行目System.ServiceModel.ServiceHostingEnvironment.HostingManager.System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(String normalizedVirtualPath) で CreateService(String normalizedVirtualPath) System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) で

4

1 に答える 1

0

保護されたパラメーターなしのコンストラクターを実装クラスに追加してみてください。

servicehost にもパラメーターなしのコンストラクターが必要だと思います。

Ninject サービス ホスト ファクトリと、提供されたスタック トレースを確認しました。次のチェックを行うと、失敗しているように見えます。

      Ensure.ArgumentNotNull((object) root, "root");
      Ensure.ArgumentNotNull((object) service, "service");
      Ensure.ArgumentNotNull((object) parameters, "parameters");

NinjectServiceHostFactory を使用するときは、必要なすべてのパラメーターを渡していることを確認してください。登録の順序を変更してみる価値があります。

また、Ninject を使用して wcf サービスをホストする方法を説明している次のリンクも参照してください。

于 2011-11-14T16:35:51.710 に答える