これは私の最初の質問であり、この問題を解決しようとしている間、何を書くべきかについて数日間悩みました。
Mark Seeman 著の Dependency Injection in .NET 本を購入し、抽象ファクトリ クラスを作成するために、それと Ninject Web サイトの例に従うように努めてきました。一般的な考え方は、フォームに質問への回答のリストが含まれているということです。回答はさまざまなタイプになる可能性があるため、ファクトリを使用して関連する回答タイプを作成しています。
エラーが発生します:
Error activating IAnswerValue
No matching bindings are available, and the type is not self-bindable.
Activation path:
1) Request for IAnswerValue
Suggestions:
1) Ensure that you have defined a binding for IAnswerValue.
2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
3) Ensure you have not accidentally created more than one kernel.
4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
5) If you are using automatic module loading, ensure the search path and filters are correct.
最初はパラメーターを使用してみましたが、この例では簡単にするために、すべて削除しました。エラーメッセージに示されている提案はどれも当てはまらないようです。フォームサービスと同様に、ファクトリタイプはバインドされていますが、回答値は明らかにバインドされていません。
これは私の NinjectWebCommon.cs のコードです
kernel.Bind<DomainModel.IAnswerValue>().To<DomainModel.AnswerValue>();
kernel.Bind<DomainModel.IAnswerValue>().To<DomainModel.StringAnswerValue>();
kernel.Bind<DomainModel.IAnswerValue>().To<DomainModel.DateTimeAnswerValue>();
kernel.Bind<IAnswerValueFactory>().ToFactory();
これは回答クラスの定義です:
public class Answer
{
readonly IAnswerValueFactory answerValueFactory;
public int Id { get; set; }
public Question Question { get; set; }
public string Type { get; set; }
public Answer(IAnswerValueFactory answerValueFactory)
{
this.answerValueFactory = answerValueFactory;
}
public void GetAnswerValue()
{
var answer = this.answerValueFactory.GetAnswerValue();
}
public List<AnswerItem> PotentialAnswers { get; set; }
}
と答えの値:
public interface IAnswerValue
{
AnswerValue GetAnswerValue();
}
public class AnswerValue : IAnswerValue
{
readonly IAnswerValue answerValue;
public AnswerValue() { }
public AnswerValue(IAnswerValue answerValue)
{
this.answerValue = answerValue;
}
public AnswerValue GetAnswerValue()
{
// this will contain a switch statement to
// determine the type returned but I have
// omitted for this example
return new StringAnswerValue();
}
}
public class StringAnswerValue : AnswerValue
{
public string StringAnswer { get; set; }
}
そして工場:
public class AnswerValueFactory : IAnswerValueFactory
{
readonly IAnswerValue answerValue;
public AnswerValueFactory(IAnswerValue answerValue)
{
this.answerValue = answerValue;
}
public IAnswerValue GetAnswerValue()
{
return (IAnswerValue)this.answerValue.GetAnswerValue();
}
}
私は自分の知識を使い果たしたように感じ、同じことを何度も何度も試しているだけです。非常に単純な何かが欠けているに違いありませんが、それが何であるかわかりません。