带有 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”类型的异常