YouTube のN=2: Kittens and Listsのチュートリアルに従っています。
KittenView
当たると吹っ飛びますOnCreate()
Cirious.CrossCore.Exceptions.MvxException: ロケーター MvxDefaultViewModelLocator から MyApp.Core.ViewModels.KittenViewModel 型の ViewModel を読み込めませんでした
IKittenGenesisService
空のコンストラクターを追加すると、アプリがエラーなしで実行されるため、サービス ( ) を解決できないようです。しかし明らかに、ビューは依存関係がなければ適切に機能しません。
FirstViewModel
同じソリューションには、 を使用するを含む以前のチュートリアルもありますICalculationService
。このサービスは正常に解決されて実行されるため、MVVM IoC が機能していることがわかります。しかし、私は2つの違いを見つけることができません。PCL プロジェクトにデバッグできないことは役に立ちませんが、それは別の問題です。
public class App: MvxApplication
{
public override void Initialize()
{
CreatableTypes()
.EndingWith("Service")
.AsInterfaces()
.RegisterAsLazySingleton();
RegisterAppStart<KittenViewModel>();
}
}
[Activity(Label = "View for KittenViewModel")]
public class KittenView : MvxActivity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.KittenView);
}
}
public class KittenViewModel: MvxViewModel
{
public KittenViewModel(IKittenGenesisService service)
{
var kittenList = new List<Kitten>();
for (var i = 0; i < 100; i++)
{
var newKitten = service.CreateNewKitten(i.ToString());
kittenList.Add(newKitten);
}
Kittens = kittenList;
}
private List<Kitten> _kittens;
public List<Kitten> Kittens
{
get { return _kittens; }
set
{
_kittens = value;
RaisePropertyChanged(() => Kittens);
}
}
}
public class KittenGenesisService: IKittenGenesisService
{
private readonly List<string> _names;
private readonly Random _random;
public KittenGenesisService()
{
_random = new Random();
_names = new List<string>()
{
"Tiddles",
"Amazon",
"Pepsi",
"Solomon",
"Butler",
"Snoopy",
"Harry",
"Holly",
"Paws"
};
}
public Kitten CreateNewKitten(string extra = "")
{
return new Kitten()
{
Name = _names[Random(_names.Count)] + extra,
ImageUrl = string.Format("http://placekitten.com/{0}/{0}"),
Price = RandomPrice()
};
}
public int Random(int count)
{
return _random.Next(count);
}
public int RandomPrice()
{
return Random(23) + 3;
}
}
それでも、これらはうまく機能します:
[Activity(Label = "View for FirstViewModel")]
public class FirstView : MvxActivity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.FirstView);
}
}
public class FirstViewModel: MvxViewModel
{
private readonly ICalculationService _calculationService;
public FirstViewModel(ICalculationService calculationService)
{
_calculationService = calculationService;
_generosity = 20;
_subTotal = 100;
Recalc();
}
// more code
}
これは私が追加した単体テストです。コンストラクターが正常に呼び出されるとKittenViewModel
、 null 参照例外ですぐに爆発します。KittenGenesisService
[TestFixture]
public class KittenViewModelTests
{
private KittenViewModel _sut;
[SetUp]
public void given_a_kittenviewmodel()
{
_sut = new KittenViewModel(new KittenGenesisService());
}
[Test]
public void the_view_model_contains_kittens()
{
_sut.Kittens.Should().NotBeEmpty();
}
}