微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c#-将代码标记为在设计时不运行

当使用新的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方法.我更新了代码示例以反映这一点.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐