2016-03-31 108 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

我建議嘗試按照我的答案底部的教程,看看是否有助於澄清一些項目。 –