1

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();
    }
}
4

1 に答える 1

3

基本が次のような場合は、いくつかチェックする価値があると思います。

  • ジェネシスサービスを実装するパブリッククラスはありますか?
  • パブリックのパラメーターなしのコンストラクターはありますか? (または、それ自体を構築できるコンストラクター)

それらが問題ないように見える場合は、おそらくいくつかのデバッグ手法を試す価値があります。

  • 問題の詳細を確認できるようにトレースを有効にします - MvvmCross Mvx.Trace の使用法を参照してください
  • app.cs でいくつかのテスト コードを試してみてください。サービスが登録された後、Mvx.CanResolve<IKittenGenesisService>()true が返されますか?
  • 単体テストからビュー モデル コードを呼び出そうとしています - うまくいきますか?
于 2013-06-26T06:20:45.670 に答える