web-dev-qa-db-ja.com

Ninject WithConstructorArgument:一致するバインディングがありません。タイプは自己バインドできません

WithConstructorArgumentについての私の理解はおそらく誤りです。これは、以下が機能しないためです。

私はサービスを持っているので、コンストラクターが複数のオブジェクトを取得するMyService、およびtestEmailという文字列パラメーターを呼び出します。この文字列パラメーターには、次のNinjectバインディングを追加しました。

string testEmail = "[email protected]";
kernel.Bind<IMyService>().To<MyService>().WithConstructorArgument("testEmail", testEmail);

ただし、次のコード行を実行すると、例外が発生します。

var myService = kernel.Get<MyService>();

ここに私が得る例外があります:

文字列のアクティブ化エラー一致するバインディングがありません。タイプは自己バインドできません。アクティベーションパス:
2)MyServiceタイプのコンストラクターのパラメーターtestEmailへの依存文字列の注入
1)MyServiceのリクエスト

提案:
1)文字列のバインディングを定義したことを確認します。
2)バインディングがモジュールで定義されている場合は、モジュールがカーネルにロードされていることを確認してください。
3)誤って複数のカーネルを作成していないことを確認してください。
4)コンストラクター引数を使用している場合、パラメーター名がコンストラクターパラメーター名と一致することを確認します。
5)自動モジュールロードを使用している場合は、検索パスとフィルターが正しいことを確認してください。

ここで何が悪いのですか?

[〜#〜]更新[〜#〜]

MyServiceコンストラクタは次のとおりです。

[Ninject.Inject]
public MyService(IMyRepository myRepository, IMyEventService myEventService, 
                 IUnitOfWork unitOfWork, ILoggingService log,
         IEmailService emailService, IConfigurationManager config,
         HttpContextBase httpContext, string testEmail)
{
    this.myRepository = myRepository;
    this.myEventService = myEventService;
    this.unitOfWork = unitOfWork;
    this.log = log;
    this.emailService = emailService;
    this.config = config;
    this.httpContext = httpContext;
    this.testEmail = testEmail;
}

私はすべてのコンストラクタパラメータタイプに標準バインディングを持っています。 'string'のみにバインディングがなく、HttpContextBaseには少し異なるバインディングがあります。

kernel.Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(new HttpContext(new MyHttpRequest("", "", "", null, new StringWriter()))));

myHttpRequestは次のように定義されています。

public class MyHttpRequest : SimpleWorkerRequest
{
    public string UserHostAddress;
    public string RawUrl;

    public MyHttpRequest(string appVirtualDir, string appPhysicalDir, string page, string query, TextWriter output)
    : base(appVirtualDir, appPhysicalDir, page, query, output)
    {
        this.UserHostAddress = "127.0.0.1";
        this.RawUrl = null;
    }
}

次のステートメントで:

_var myService = kernel.Get<MyService>();
_

MyServiceを解決しようとしています。MyServiceタイプがカーネルに登録されていないため、Ninjectはそれを自己バインドタイプとして扱います。

そのため、WithConstructorArgumentを使用して_"testEmail"_を解決することはありません。これは、Bind<IMyService>()でのみ使用されるため、例外が発生するためです。

したがって、MyServiceを登録した場合:

_string testEmail = "[email protected]";
kernel.Bind<IMyService>().To<MyService>()
      .WithConstructorArgument("testEmail", testEmail);
_

次に、登録済みのインターフェース(IMyService)を使用して解決する必要があります。

_var myService = kernel.Get<IMyService>();
_
35
nemesv

Nemesvは正しい応答を持っていますが、私は同じエラーに遭遇し、私のための解決策は不正なDLL/binにありました。私はまだ存在するいくつかのクラスをリファクタリングして削除/移動しました私の古いDLLソリューション-古いDLLを削除します。

2
jrap