Мое понимание WithConstructorArgument, вероятно, ошибочно, потому что следующее не работает:
У меня есть сервис, который можно назвать MyService, чей конструктор принимает несколько объектов, и строковый параметр, называемый testEmail. Для этого параметра строки я добавил следующую привязку Ninject:
string testEmail = "[email protected]";
kernel.Bind<IMyService>().To<MyService>().WithConstructorArgument("testEmail", testEmail);
Однако при выполнении следующей строки кода я получаю исключение:
var myService = kernel.Get<MyService>();
Вот исключение, которое я получаю:
Строка, вызывающая ошибку. Отсутствуют соответствующие привязки, и тип не является самопереключаемым. Путь активации:
2) Инъекция строка зависимости в параметре testEmail конструктора типа MyService
1) Запрос на услугу MyServiceПредложения:
1) Убедитесь, что вы определили привязку для строки.
2) Если привязка была определена в модуле, убедитесь, что модуль имеет были загружены в ядро.
3) Убедитесь, что вы случайно не создано более одного ядра.
4) Если вы используете конструктор аргументы, убедитесь, что имя параметра соответствует конструкторам имя параметра.
5) Если вы используете автоматическую загрузку модуля, правильный путь поиска и фильтры.
Что я здесь делаю неправильно?
UPDATE
Вот конструктор 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;
}
У меня есть стандартные привязки для всех типов параметров конструктора. Только "строка" не имеет привязки, а 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;
}
}