带有 NullReferenceException 的 Xamarin 跨平台中的 Ninject 实现

Posted

技术标签:

【中文标题】带有 NullReferenceException 的 Xamarin 跨平台中的 Ninject 实现【英文标题】:Ninject implementation in Xamarin Cross Platform with NullReferenceException 【发布时间】:2016-07-20 12:22:50 【问题描述】:

我是一名快乐的新 Xamarin 开发人员,但不幸的是,我遇到了第一个项目问题。当我使用 MVC 时,我曾经使用过 Ninject。所以,我决定在 Xamarin 项目中也使用这个工具作为我的 IoC 和 DI。我的解决方案包含用于共享数据的 ios 项目、android 项目和 PCL。 在我的 PCL 项目中,我创建了我的 NinjectModule(到目前为止非常简单的实现..:))

public class NinjectModuleImplementation : NinjectModule

    public override void Load()
    
        this.Bind<IMapPoint>().To<MapPoint>();
    

以及我创建容器的另一个静态类:

public static class Startup

    public static StandardKernel Container  get; set; 

    public static void BuildContainer()
    
        var kernel = new Ninject.StandardKernel(new NinjectModuleImplementation());           
        Startup.Container = kernel;
    

在我的原生项目中,我调用 Startup.BuildContainer();

安卓:

[Application]
public class App : Application

    public App(IntPtr h, JniHandleOwnership jho) : base(h, jho)
    
    

    public override void OnCreate()
    
        Startup.BuildContainer();
    

iOS

[Register ("AppDelegate")]
public class AppDelegate : UIApplicationDelegate

    public override UIWindow Window 
        get;
        set;
    

    public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
    
        Startup.BuildContainer();
        return true;
    

现在,当我尝试“显式”解决我的依赖项时,没有问题 - 它可以工作。

IMapPoint point = Startup.Container.Get<IMapPoint>();

但是,当我尝试通过构造函数注入我的依赖项时 - 就像这样:

public class SomeClass

    public static SomeClass Instance  get; private set; 
    public IMapPoint point;

    public SomeClass(IMapPoint _point)
    
        Instance = this;
        point = _point;
    

NullReferenceException 被抛出...我做错了什么? 我将不胜感激任何建议:)

问候,

马吕斯

【问题讨论】:

【参考方案1】:

每个平台都有一个模块吗?

应用程序.cs

[Application(Theme = "@style/Base.Theme", Icon = "@mipmap/ic_launcher")]
public class ConquerApplication : Application

    public static IKernel Container  get; set; 

    public ConquerApplication(IntPtr handle, JniHandleOwnership ownerShip)
        : base(handle, ownerShip)
    
    

    public override void OnCreate()
    
        var kernel = new Ninject.StandardKernel(new ConquerModule());

        Container = kernel;

        base.OnCreate();
    

安卓模块

public class ConquerModule : NinjectModule

    public override void Load()
    
        //Bind<IThing>().To<Thing>();
        this.Bind<ISQLite>().To<AndroidSQLite>();
        this.Bind<IPersonRepository>().To<PersonRepository>();
        this.Bind<ICycleRepository>().To<CycleRepository>();
        this.Bind<IConquerDatabase>().To<ConquerDatabase>();
        this.Bind<IntroViewModel>().ToSelf().InSingletonScope();
    

您可以在此处查看一个相当简单的示例: https://github.com/RobGibbens/Xamarin.IoC/tree/master/NinjectDemo

【讨论】:

你好乔恩。我的模块存储在 PCL 项目中。但是,我通过静态启动类和道具容器从本地项目到模块的引用。我认为可以在 PCL 中创建一个模块……对吗?否则,如果我将模块放入本机项目,如何在 PCL 中使用我的 IoC 容器? PCL 没有参考 iOS/Android.. 我建议您尝试按照答案底部的教程进行操作,看看这是否有助于澄清某些项目。

以上是关于带有 NullReferenceException 的 Xamarin 跨平台中的 Ninject 实现的主要内容,如果未能解决你的问题,请参考以下文章

尝试为对象设置值时出现 NullReferenceException

Datagridview NullReferenceException 在计时器中更新时出错

发生“System.NullReferenceException”类型的异常

NullReferenceException,没有堆栈跟踪......从哪里开始?

注入NullReferenceException

什么是 NullReferenceException,我该如何解决?