2016-03-31 44 views
2

Yeni bir mutlu Xamarin geliştiricisiyim ve maalesef ilk proje sorunumda sıkışmış durumdayım. MVC ile çalışırken, Ninject ile çalışıyordum. Bu nedenle, bu aracı Xamarin projesinde de IoC ve DI olarak kullanmaya karar verdim. Çözümüm paylaşılan veriler için IOS projesi, Android projesi ve PCL'yi içeriyor. Benim PCL projede Ben (şimdiye kadar çok basit uygulama .. :)) benim NinjectModule yarattıNullReferenceException ile Xamarin Cross Platform'da Ninject Uygulaması

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

Ve ben kapsayıcı oluşturmak diğer statik sınıf: benim ana projede

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

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

Ben Startup.BuildContainer();

Android: Ben "açıkça" benim bağımlılıkları kararlılığını çalıştığı sırada

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

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

Ve iOS

Şimdi
[Register ("AppDelegate")] 
public class AppDelegate : UIApplicationDelegate 
{ 
    public override UIWindow Window { 
     get; 
     set; 
    } 

    public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions) 
    { 
     Startup.BuildContainer(); 
     return true; 
    } 

, sorun yoktur - bu çalışır. Ancak

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

, ben yapıcı benim bağımlılığı enjekte deneyin - Böyle:

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

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

NullReferenceException atılır ... Neyi yanlış yapıyorum? Eğer her platform başına bir modül var mı ben, herhangi bir öneri :)

Saygılar için

Mariusz

cevap

0

minnettar olacağım ?

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 Modülü burada görüntüleyebilmek bu oldukça basit bir örnek var

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

Merhaba Jon. Modülüm PCL Projesi'nde saklanır. Ancak, Natives projesinden Modül'e statik Başlangıç ​​sınıfı ve Prop Container tarafından bir referansım var. PCL'de bir modül oluşturmanın mümkün olduğunu düşündüm ... Doğru muyum? Aksi takdirde, modülümü yerel projeye koyarsam IoC kabımı PCL'de nasıl kullanırım? PCL, iOS/Android referansına sahip değildir. – Mariusz

+0

Cevabımın altındaki öğreticiyi izlemeyi ve bunun bazı öğelerin netleştirilmesine yardımcı olup olmadığını görmenizi öneririz. –