2013-07-31 3 views
0

У меня есть общие привязки, и один из них заключается в следующем: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. Так это ожидаемое поведение и любой способ заставить его использовать переопределенный тип?

+0

Обычно контроллеры разрешаются по их типам, а не по некоторому интерфейсу, также вам не нужно регистрировать их «Именованные», поэтому попробуйте с регистрацией: «Bind (). ToSelf(). WithConstructorArgument (« emailHasher ", новый Md5Hasher());' – nemesv

+0

Существует причина этого, которая выходит за пределы этого вопроса, поскольку я использую архитектуру стиля плагина, и к контроллерам обращаются по именам, но я просто хотел поместить их в том, что это было что может повлиять на процесс инъекций в этой области. Поэтому есть причина, почему существует интерфейс с конкретным типом и критериями именования. – Grofit

+1

'WithConstructorArgument' должен работать так, как ожидалось, поэтому в вашей пользовательской архитектуре стиля плагина есть что-то еще, что приводит к вашей проблеме ... возможно, ваши регистрации контроллеров не вызываются в правильном порядке, а ваша регистрация« WithConstructorArgument »позже переопределяется по умолчанию. .. – nemesv

ответ

1

Я полагаю, что это контроллер MVC. MVC Framework разрешит SomeController не ISomeController. Следовательно, ваша привязка не применяется, но Ninject будет использовать неявное привязку SomeControllerToSelf.

Создайте переплет для SomeControllerToSelf вместо этого.

+0

Фактический пример использования немного сложнее с настраиваемыми фабриками контроллеров и вещами, поэтому он работает с интерфейсами и именованными привязками, а не с интерфейсом, так как они все IControllers позволяют плагинам времени выполнения подключаться, не зная тип. В любом случае, вы даете ответ, так как это будет способ решить его в любом случае * обычного * использования. – Grofit