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 被抛出...我做错了什么?我将不胜感激任何建议:)
问候,
马留斯
每个平台都有一个模块吗?
应用程序.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
| 归档时间: |
|
| 查看次数: |
2605 次 |
| 最近记录: |