我正在构建一个使用Ninject(一个DI框架)的Xamarin iOS应用程序。我想知道在哪里放置加载模块的代码并进行应用程序类的初始化?
Main.cs
班?最佳做法是什么?我似乎无法在谷歌上找到它。
答案 0 :(得分:3)
由于在UIApplication构造期间创建/初始化UIApplication
runloop这一事实,我会避免使用Main
入口点作为全局应用程序启动点,因为应用程序的runloop不是可用。在此阶段调用任何iOS框架成员可能会导致奇怪的应用程序行为,崩溃,文件损坏等。
此时挂起(延迟)应用程序的任何初始化代码都会导致操作系统终止您的进程,并且不会发生任何外部崩溃报告。 Apple的崩溃报告将是非常通用的SIGABRT报告。
在UIApplication构建期间也会创建UIApplicationDelegate
,并在FinishedLaunching
,其runloop和application:didFinishLaunchingWithOptions:
之后发送UIApplication
(UIApplicationDelegate
)委托方法构造,但在UIWindow
和根VC之前,因此使它成为首选的委托覆盖。
答案 1 :(得分:1)
FinishedLaunching
AppDelegate.cs
方法肯定是一个地方,但在几个应用中,我需要之前已解决的依赖项,因为它们在FinishedLaunching
中使用,所以我已经习惯了把它放在App.cs的Main
方法中。
以下是使用Splat.Locator
进行基本DI的应用的一个非常简单的示例:
public class App
{
private static void Main(string[] args)
{
// Register platform-specific dependencies.
RegisterDependencies();
// Launch UI.
UIApplication.Main(args, null, "AppDelegate");
}
private static void RegisterDependencies()
{
// Akavache secure cache encryption provider.
var encryptionProvider = new KeystoreBackedEncryptionProvider(Akavache.BlobCache.TaskpoolScheduler, CacheManager.AppName, CacheManager.CacheName);
Locator.CurrentMutable.RegisterConstant(encryptionProvider, typeof(Akavache.IEncryptionProvider));
}
}
答案 2 :(得分:0)
AppDelegate
通常是您放置任何应用启动代码的地方