У меня есть общие привязки, и один из них заключается в следующем:Ninject WithConstructorArgument не переопределяет глобальное связывание для типа?
Bind<IHasher>().To<SHA256Hasher>();
Это прекрасно работает, так как есть несколько классов в течение которых использует этот Hasher. Однако есть один или два контроллера, которым требуется другой тип хэширования для использования хэша с третьими сторонами, например gravatar, которые ожидают хэши md5. Итак я ниже:
Bind<ISomeController>().To<SomeController>().Named("SomeController").WithConstructorArgument("emailHasher", new Md5Hasher());
Тогда мой контроллер выглядит следующим образом:
public class SomeController : Controller
{
private IHasher emailHasher;
public CampaignController(IHasher emailHasher)
{
this.emailHasher = emailHasher;
}
}
При отладке я ожидал бы IHasher быть Md5Hasher, однако это Sha256Hasher. Так это ожидаемое поведение и любой способ заставить его использовать переопределенный тип?
Обычно контроллеры разрешаются по их типам, а не по некоторому интерфейсу, также вам не нужно регистрировать их «Именованные», поэтому попробуйте с регистрацией: «Bind(). ToSelf(). WithConstructorArgument (« emailHasher ", новый Md5Hasher());' –
nemesv
Существует причина этого, которая выходит за пределы этого вопроса, поскольку я использую архитектуру стиля плагина, и к контроллерам обращаются по именам, но я просто хотел поместить их в том, что это было что может повлиять на процесс инъекций в этой области. Поэтому есть причина, почему существует интерфейс с конкретным типом и критериями именования. – Grofit
'WithConstructorArgument' должен работать так, как ожидалось, поэтому в вашей пользовательской архитектуре стиля плагина есть что-то еще, что приводит к вашей проблеме ... возможно, ваши регистрации контроллеров не вызываются в правильном порядке, а ваша регистрация« WithConstructorArgument »позже переопределяется по умолчанию. .. – nemesv