我正在构建一个基本的ninject容器来替换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绑定到匿名方法的原因,而不是标准绑定。
我 THINK 原因是因为这是绑定到已经为其定义实例的对象的正确方法(如上面的行中的情况)但是我讨厌查看代码和不知道它做了什么。我的假设是正确的吗?
答案 0 :(得分:1)
deanvmc,
简而言之:是的,你是对的。
您正在使用Ninject工厂方法(请参阅http://bit.ly/AB9Eg9)。工厂可以退回任何类型的INavigationService
,您只需选择退回现有的PhoneApplicationServiceAdapter
干杯!
答案 1 :(得分:1)
更好的方法是使用_kernel.Bind<INavigationService>().ToConstant(_navigationService)
这将允许缓存绑定,而不必每次都调用只返回相同对象的Func。