4

WCF Ninject 拡張機能を使用して WCF サービスに Ninject を追加しようとしています。

エラーが発生します:

指定されたサービス タイプは、デフォルト (パラメーターなし) のコンストラクターを持たないため、サービスとして読み込むことができませんでした。この問題を解決するには、既定のコンストラクターを型に追加するか、型のインスタンスをホストに渡します。

このサービスには Ninject Service Host ファクトリがあります。

<%@ ServiceHost Language="C#" Debug="true" CodeBehind="SchedulingSvc.svc.cs"
          Service="Scheduling.SchedulingSvc"
          Factory="Ninject.Extensions.Wcf.NinjectWebServiceHostFactory" %>

global.asax ファイルは NinjectHttpApplication から継承し、CreateKernel は NinjectModule を持つ新しいカーネルを返します。

public class Global : NinjectHttpApplication
{
    protected override IKernel CreateKernel()
    {
        return new StandardKernel(new NinjectServiceModule());
    }
}

NinjectModule:

public class NinjectServiceModule : NinjectModule
{
    public override void Load()
    {
        this.Bind<ISchedulingService>().To<SchedulingSvc>();
        this.Bind<ISchedulingBusiness>().To<SchedulingBusiness>();
    }
}

コンストラクター注入によるサービス:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class SchedulingSvc : ISchedulingService
{
    private ISchedulingBusiness _SchedulingBusiness = null;

    public SchedulingSvc(ISchedulingBusiness business)
    {
        _SchedulingBusiness = business;
    }

    public CalendarEvent[] GetCalendarEvents()
    {
        var calendarEvents = _SchedulingBusiness.GetCalendarEvents();
        return calendarEvents;
    }
    ...
}

プロパティ注入を伴うサービス:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class SchedulingSvc : ISchedulingService
{
    [Inject] public ISchedulingBusiness _SchedulingBusiness { get; set; }

    public SchedulingSvc()
    {
    }

    public CalendarEvent[] GetCalendarEvents()
    {
        var calendarEvents = _SchedulingBusiness.GetCalendarEvents();
        return calendarEvents;
    }
    ...
}

コンストラクター注入を使用すると、投稿の上部に記載されているエラーが発生します。プロパティ インジェクションを使用しようとすると、_ScheduleBusiness は常に null になります。

私は何が欠けていますか?

4

3 に答える 3

1

わかりました、これでいいと思います。Ninject の設定がオフになっている可能性があります。セットアップにはいくつかの「方法」があるため、以前にこれが発生しましたが、それらのいくつかは常に機能するとは限りません。

AspNet 互換モードを使用し、Web プロジェクトを通じてこれをホストしているようです。Ninject.Web を使用していますね。実際には、グローバルを Ninject から継承する必要はありません。グローバルからすべての Ninject 参照とコードを削除し、NinjectServiceModule を取り除きます。NuGet から Ninject.Web をインストールした場合は、App_Start フォルダーにファイル " NinjectWebCommon.cs " が作成されているはずです。これは、次のようにバインディングを設定する場所です。

    private static IKernel CreateKernel()
    {
        var settings = new NinjectSettings { InjectNonPublic = true };

        var kernel = new StandardKernel(settings);
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices(kernel);

        return kernel;
    }

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<AdminHelper>().ToSelf().InRequestScope();
        kernel.Bind<AuditHelper>().ToSelf().InRequestScope();
        kernel.Bind<ErrorHelper>().ToSelf().InRequestScope();
        kernel.Bind<GoalHelper>().ToSelf().InRequestScope();
    }

これらのメソッドは既にそこにあるはずで、ほとんどのメソッドは既に設定されているため、RegisterServices にバインディングを設定するだけで済みます。

App_Start フォルダーにもNinjectWeb.csがあるはずです。変更する必要はありません。存在することを確認するだけです。

後で、サービス マークアップの Factory 属性を "Ninject.Extensions.Wcf.NinjectServiceHostFactory" に戻す必要がある場合もあります。または、両方を試して、何が機能するかを確認してください。

これら 2 つのファイルだけで、Ninject を機能させることができます。このルートをたどってみてください。私はそれがそれを修正する予感を持っています。

于 2013-06-25T13:54:31.887 に答える
1

そのエラー メッセージが表示されるのは、(Ninject.Extensions.Interceptor ライブラリおよび/または Castle DynamicProxy を使用して) インターセプターを使用しようとしたときだけです。これは、パラメーターを持つコンストラクターが好きではない部分です。

それ以外の場合、これは正常に機能するはずです。インターセプターを使用していないようですが、これの目的は何ですか?:

this.Bind<ServiceHost>().To<NinjectServiceHost>();

ここで何らかのカスタム サービス ホストを使用していると思いますが、目的には必要ありません。上記のコードを機能させるために必要なのは、次のとおりです。

1: サービス マークアップの Factory 属性 (これがあります) 2: カーネルでバインドされたコンストラクターの依存関係 (これがあります)

現在、この正確なセットアップが機能しているため、NinjectServiceHost の何かがこの問題を引き起こし、何らかのインターセプターを接続しようとしていると思います。

于 2013-06-20T20:08:43.697 に答える
0

WCF (または任意の Web) サービスでは、サービスをインスタンス化するためにパラメーターのないコンストラクターが必要だと思います。パラメーター化されたコンストラクターを提供したため、Ninject はサービスを初期化できなかった可能性があります。

お願いします。このリンクも参照して ください http://social.msdn.microsoft.com/Forums/vstudio/en-US/550d82eb-a2bc-4c08-b846-e3fb1b966457/no-parameterless-constructor-error-in-wcf

于 2013-06-19T18:23:32.080 に答える