【问题标题】:Ninject implementation in Xamarin Cross Platform with NullReferenceException带有 NullReferenceException 的 Xamarin 跨平台中的 Ninject 实现
【发布时间】: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 被抛出...我做错了什么? 我将不胜感激任何建议:)

问候,

马吕斯

【问题讨论】:

    标签: dependency-injection xamarin ninject ioc-container


    【解决方案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..
    • 我建议您尝试按照答案底部的教程进行操作,看看这是否有助于澄清某些项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    相关资源
    最近更新 更多