当使用新的Xamarin.iOS设计器时,它将自动创建您的控制器,视图等,因此您的C#代码可以在设计图面上运行并实际呈现(而不必等到运行时).
因此,如果您有一个控制器,它是构造函数,则将调用ViewDidLoad.
所以说我有一个像这样的控制器:
class MyController
{
readonly ISomeService service;
public MyController(IntPtr handle) : base(handle)
{
service = MyIoCContainer.Get<ISomeService>();
}
}
显然,在设计时,IoC容器将完全为空并引发异常.
Xamarin.iOS设计器是否可以解决此问题?也许#if!DESIGN_TIME或类似的性质?还是有办法让我的IoC容器在设计时返回所有对象的模拟实例?
解决方法:
当前推荐的方法是让您的类实现IComponent接口.有关更多信息,请参见this doc.因此,您的MyController类可能看起来像这样:
[Register ("MyController")]
class MyController : UIViewController, IComponent
{
#region IComponent implementation
public ISite Site { get; set; }
public event EventHandler Disposed;
#endregion
readonly ISomeService service;
public MyController(IntPtr handle) : base(handle)
{
}
public override void AwakeFromNib ()
{
if (Site == null || !Site.DesignMode)
service = MyIoCContainer.Get<ISomeService>();
}
}
请注意,Site在构造函数中将始终为null.从情节提要板进行初始化的首选位置是AwakeFromNib方法.我更新了代码示例以反映这一点.