Xamarin iOS应用初始化代码应放置于何处?
嘿,这个问题问得很到位——很多刚用Ninject搞Xamarin iOS的开发者都会卡在这里。直接给你结论+实践方案:
关于Xamarin iOS中Ninject模块加载与初始化的最佳实践
最推荐的位置是你的应用委托类(AppDelegate.cs),其次是Main.cs(仅特殊场景用),绝对不建议放在第一个ViewController里,你觉得不合理完全正确。
为什么优先选AppDelegate?
- AppDelegate是iOS应用的核心生命周期管家,负责处理应用启动、后台切换等全局事件,在这里初始化DI容器完全符合“应用启动时完成全局依赖配置”的逻辑。
- 它是全局可访问的(可以把容器实例存为静态属性),后续任何ViewController或服务类都能方便获取依赖。
- 不会像ViewController那样,因为页面跳转、重建(比如横竖屏切换)导致容器重复初始化或过早销毁。
具体实现示例
1. 在AppDelegate中初始化容器并加载模块
using Ninject; using UIKit; namespace YouriOSAppNamespace { public partial class AppDelegate : UIApplicationDelegate { // 全局共享的DI容器实例 public static IKernel DependencyKernel { get; private set; } public override bool FinishedLaunching(UIApplication app, NSDictionary options) { // 初始化Ninject内核并加载自定义模块 DependencyKernel = new StandardKernel(); DependencyKernel.Load(new YourAppCoreModule(), new YourAppServiceModule()); // 初始化应用窗口与根视图控制器(这里用DI获取,而非直接new) Window = new UIWindow(UIScreen.MainScreen.Bounds); Window.RootViewController = DependencyKernel.Get<MenuViewController>(); Window.MakeKeyAndVisible(); return true; } } }
2. 自定义Ninject模块示例
using Ninject.Modules; public class YourAppCoreModule : NinjectModule { public override void Load() { // 绑定单例服务 Bind<IUserAuthService>().To<RemoteAuthService>().InSingletonScope(); // 绑定视图模型到对应的视图控制器(按需) Bind<MenuViewModel>().ToSelf(); } }
什么时候考虑用Main.cs?
如果你的应用有必须在AppDelegate启动前就初始化的底层依赖(这种场景极少,比如某些全局日志服务),可以在Main.cs的Main方法里提前初始化容器,但这里的代码会先于AppDelegate执行,后续维护起来不如AppDelegate直观,所以非特殊需求不推荐。
为什么绝对不能放在ViewController里?
- ViewController的职责是处理UI交互,把应用级的DI配置放在这里,完全违背了单一职责原则。
- 如果ViewController因页面跳转、内存回收被销毁重建,很可能导致容器重复初始化,引发依赖实例的混乱(比如单例服务变成多实例)。
内容的提问来源于stack exchange,提问作者Simon Corcos
相关产品推荐
相关产品推荐

