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