2016-03-31 13 views
2

Ich bin ein neuer glücklicher Xamarin-Entwickler und leider blieb ich bei meinem ersten Projektproblem stecken. Als ich mit MVC gearbeitet habe, habe ich mit Ninject gearbeitet. Also habe ich beschlossen, dieses Tool auch als IoC und DI im Xamarin-Projekt zu verwenden. Meine Lösung enthält IOS-Projekt, Android-Projekt und PCL für gemeinsame Daten. In meinem PCL-Projekt habe ich meine NinjectModule (sehr einfache Implementierung so weit .. :))Ninject-Implementierung in Xamarin Cross Platform mit NullReferenceException

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

und die andere statische Klasse, wo ich meinen Container erstellen:

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

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

In meinem Heimat Projekt I rufe Startup.BuildContainer() auf;

Android:

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

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

Und 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; 
    } 

Nun, als ich meine Entschlossenheit Abhängigkeiten "explizit" versuchen, gibt es kein Problem - es funktioniert.

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

Allerdings, wenn ich meine Abhängigkeit injizieren von Konstruktor versuchen - wie folgt aus:

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

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

Nullreferenceexception geworfen wird ... Was mache ich falsch? werde ich für alle Vorschläge :)

Grüße dankbar,

Mariusz

Antwort

0

Sie für jede Plattform ein Modul haben Sie?

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 Modul

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

ein ziemlich einfaches Beispiel dafür gibt es, die Sie hier sehen können: https://github.com/RobGibbens/Xamarin.IoC/tree/master/NinjectDemo

+0

Hallo Jon. Mein Modul ist in PCL Project gespeichert. Aber ich habe eine Referenz von Eingeborenen-Projekt zu Modul durch statische Startup-Klasse und Prop-Container. Ich dachte, dass es möglich ist, ein Modul in PCL zu erstellen ... Habe ich Recht? Wie kann ich meinen IoC-Container in PCL verwenden, wenn ich mein Modul in ein natives Projekt einfügen möchte? PCL hat keinen Bezug zu iOS/Android. – Mariusz

+0

Ich würde empfehlen, zu versuchen, das Tutorial am Ende meiner Antwort zu folgen und zu sehen, ob das hilft, einige Punkte zu klären. –