2016-03-31 85 views
2

我是一个新的快乐Xamarin开发人员,不幸的是我卡住了我的第一个项目问题。当我使用MVC时,我曾经与Ninject一起工作。所以,我决定在Xamarin项目中使用这个工具作为我的IoC和DI。我的解决方案包含IOS项目,Android项目和PCL共享数据。 在我的PCL项目我创建了NinjectModule(非常简单的实现迄今.. :))Xamarin跨平台Ninject实现与NullReferenceException

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 ......我在做什么错? 我会很感激的任何建议:)

问候,

的Mariusz

回答

0

你有每个的每个平台的模块?

Application.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(); 
    } 
} 

的Android模块

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

+0

您好乔恩。我的模块存储在PCL项目中。但是,我通过静态Startup类和prop Container从本地项目到Module的引用。我认为可以在PCL中创建一个模块...我是对的吗?否则,如果我将模块放到本地项目中,如何在PCL中使用IoC容器? PCL没有参考iOS/Android .. – Mariusz

+0

我建议尝试按照我的答案底部的教程,看看是否有助于澄清一些项目。 –