Понимание того, что делает эта привязка - PullRequest
0 голосов
/ 09 февраля 2012

Я строю базовый пустой контейнер для замены телефонного контейнера в Caliburn.Micro, поскольку я хочу придерживаться одного контейнера IoC для нескольких проектов. Плюс это весело ...

Одним из способов является регистрация в телефонных службах, которая выглядит следующим образом:

 public void RegisterPhoneServices(bool treatViewAsLoaded = false)
    {
        var _phoneService = new PhoneApplicationServiceAdapter(_rootFrame);
        var _navigationService = new FrameAdapter(_rootFrame, treatViewAsLoaded);

        _kernel.Bind<INavigationService>().ToMethod(x => _navigationService);
        _kernel.Bind<IPhoneService>().ToMethod(x => _phoneService);

        _kernel.Bind<IEventAggregator>().To<EventAggregator>().InSingletonScope();
        _kernel.Bind<IWindowManager>().To<WindowManager>().InSingletonScope();

        _kernel.Bind<TaskController>().ToSelf().InSingletonScope();

        var _taskController = Kernel.Get<TaskController>();
        _taskController.Start();
    }

Часть, которую я не понимаю, заключается в том, почему INavigationService и IPhoneService привязаны к анонимным методам, а не к стандартному связыванию.

I THINK причина в том, что это правильный способ привязки к объекту, для которого вы уже определили экземпляр (как в случае с строками выше), но я ненавижу видеть код, а не зная, что он делает. Я прав в своем предположении?

Ответы [ 2 ]

1 голос
/ 11 июля 2014

Лучший способ сделать это - использовать _kernel.Bind<INavigationService>().ToConstant(_navigationService) Это позволит кэшировать привязку, а не вызывать Func, который каждый раз просто возвращает один и тот же объект.

1 голос
/ 09 февраля 2012

deanvmc, короче

: да, вы правы.

вы используете фабричный метод Ninject (см. http://bit.ly/AB9Eg9). Фабрика может вернуть любой видINavigationService в вашем случае вы просто хотите вернуть свои существующие PhoneApplicationServiceAdapter

Приветствия!

...