Ninject WithConstructorArgument: нет соответствующих привязок, и тип не является самопереключаемым
Мое понимание 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;
}
}
Ответы
Ответ 1
С выражением:
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>();
Ответ 2
В то время как nemesv имеет правильный ответ, я столкнулся с той же ошибкой, и решение для меня было мошеннической DLL в моем /bin. Я отредактировал и удалил/переместил некоторые классы, которые все еще присутствовали в моей старой DLL. Решение - удалите старую DLL.