在 Xamarin 跨平台中使用 NullReferenceException 实现 Ninject

Mar*_*usz 6 dependency-injection ninject ioc-container xamarin

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

public class NinjectModuleImplementation : NinjectModule
{
    public override void Load()
    {
        this.Bind<IMapPoint>().To<MapPoint>();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public static class Startup
{
    public static StandardKernel Container { get; set; }

    public static void BuildContainer()
    {
        var kernel = new Ninject.StandardKernel(new NinjectModuleImplementation());           
        Startup.Container = kernel;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的本地项目中,我调用 Startup.BuildContainer();

安卓:

[Application]
public class App : Application
{
    public App(IntPtr h, JniHandleOwnership jho) : base(h, jho)
    {
    }

    public override void OnCreate()
    {
        Startup.BuildContainer();
    }
}
Run Code Online (Sandbox Code Playgroud)

和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;
    }
Run Code Online (Sandbox Code Playgroud)

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

IMapPoint point = Startup.Container.Get<IMapPoint>();
Run Code Online (Sandbox Code Playgroud)

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

public class SomeClass
{
    public static SomeClass Instance { get; private set; }
    public IMapPoint point;

    public SomeClass(IMapPoint _point)
    {
        Instance = this;
        point = _point;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

问候,

马留斯

Jon*_*las 0

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

应用程序.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();
    }
}
Run Code Online (Sandbox Code Playgroud)

安卓模块

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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