0
interface IWarrior 
{ 
} 

class Samurai : IWarrior 
{ 
} 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var kernel = new StandardKernel(); 

     kernel.Bind<IWarrior>().To<Samurai>().When(i => 
     { 
      Console.WriteLine("test"); 
      return true; 
     }); 

     IWarrior warrior = kernel.Get<IWarrior>(); 
    } 
} 

Вот очень простой сценарий, я создаю фиктивный интерфейс + реализация и связать их с помощью Ninject вContextual Binding и When метод, который return true, а также выход «тест msgstr "сообщение на консоль при вызове. Я думал, что When() будет вызываться только один раз в Get<>() ожидается его выход «тест» только один раз, но волшебно (или нет?^_ ^) выводит в 3 раза «тест»,Ninject контекстная связывание Когда вызывается метод слишком много раз

test 
test 
test 

, что означает, что When() называется 3 раза за один запрос Get<>() (я добавил еще одну реализацию IWarrior и связал ее, затем количество выходных данных было 6 (3 на привязку)).

Почему это происходит? Мы собираемся поставить некоторые нетривиальные (и слишком много времени) проверки на привязку, но вызов его три раза вместо одного будет проблемой.

+1

Нормально, что 'When' называется многократным временем для одного вызова Get. В любом случае вы не должны ставить логику времени в «Когда». Если вы планируете это сделать, вам следует пересмотреть свой подход к дизайну и решению. – nemesv

+0

Спасибо за ответ, можете ли вы рассказать мне, в чем причина называть его несколько раз? или дать ссылку на статью об этом. – Lev

ответ

1

Для одной активации Ninject будет оценивать, может ли он решить ваш запрос, используя делегат, предоставленный в When. И из-за внутренней реализации Ninject, это может вызвать это несколько раз. Источником для этого является исходный код Ninject, доступный на github.

У него нет средств знать тип условного или если логика занимает много времени.

И в качестве примечания: Это одна из причин, по которой контейнер Ninject намного медленнее по запросу активации, чем другие. Именно потому, что это поддержка расширенных контекстных/условных привязок, где каждый запрос активации должен оцениваться с учетом его контекста (и не кэшироваться).

Смежные вопросы