1

私たちはMvvmCrossプロジェクトでxamarin.androidからIoCを実装しようとしています。 AndroidのMvxActivityでアンドロイドプロジェクト(ないのViewModel)xamarin.androidでIoCコンテナを取得

Setup.cs

protected override IMvxIoCProvider CreateIocProvider() 
    { 
     _provider = base.CreateIocProvider(); 
     return _provider; 
    } 
    protected override void InitializeFirstChance() 
    { 
     _provider.RegisterSingleton<INotificationService>(new NotificationService(ApplicationContext)); 
     _provider.RegisterType<ITaskFilter>(() => new FilterView()); 
     base.InitializeFirstChance(); 
    } 

の、Setup.csにIoCコンテナで指定された型を取得する方法を見つけ出すことができない、我々は2つの方法がありますが、最初のものは動作していませんし、2番目のものは私たちが従おうとしている固い原則を破ります。

[MvvmCross.Platform.IoC.MvxInject] 
public ITaskFilter TaskFilter { get; set; } 

そして

public TasksView() 
    { 
     var taskFilter = MvvmCross.Platform.IoC.MvxSimpleIoCContainer.Instance.Resolve<ITaskFilter>(); 
    } 

TaskFilter.Initialize(this); 

私は答えられるために、この問題のために複数の必要がありそうです知っている、あなたが必要なもののためにお問い合わせください。 Mvx.Resolve<T> ような単純なよう

MvvmCross.Platform.IoC.MvxSimpleIoCContainer.Instance.Resolve<ITaskFilter>(); 

It'sをしかし、サービスロケータパターンはベストプラクティスではありませんというのは本当it's: おかげ

答えて

2

あなたは、ものを解決するために、このラインを必要とするドント。

Mvxは通常コンストラクタインジェクションで動作しますが、私はあなたがアンドロイドのビューで使用できないのではないかと恐れています。 代わりに、あなたはViewModelにでそれを行うことができます。

public ITaskFilter TaskFilter { get; private set }; 

public YourViewModel(ITaskFilter taskFilter) 
{ 
    this.TaskFilter = taskFilter; 
} 

は、その後、あなたのビューから、あなたは私がして、この作業を得たViewModel.TaskFilter

+0

ありがとう@xleon。インタフェースITaskFilterはアンドロイドのビューにあります。アンドロイドとIoC固有のものですから。それでViewModelの外に置いておきたいのですが、ViewModelからアンドロイドビューのインターフェースに依存関係が作成されます。しかし、あなたが言及したように、アンドロイドの視点でそれを使用する方法はありませんので、私たちが望むやり方が期待通りに動作しないようです。 – cfl

1

にアクセスすることができます。

だけで使用するために必要な
public ITaskFilter TaskFilter { get; set; } 
protected override void OnCreate(Bundle bundle) 
{ 
    TaskFilter = Mvx.Resolve<ITaskFilter>(); 
    TaskFilter.Initialize(this); 
} 

Mvx.Resolve ViewModelを使用する必要はありません。 Androidビューのsetup.csにIoCコンテナを設定し、それを呼び出すだけです。

関連する問題