1

我正在关注 YouTube 上N=2 的教程:小猫和列表

KittenView击中时会爆炸OnCreate()

Cirrious.CrossCore.Exceptions.MvxException:无法从定位器 MvxDefaultViewModelLocator 加载类型 MyApp.Core.ViewModels.KittenViewModel 的 ViewModel

似乎无法解析服务(IKittenGenesisService),因为当我添加一个空的构造函数时,应用程序运行没有错误。但显然,如果没有它的依赖关系,该视图将无法正常工作。

同样的解决方案还有一个较早的教程,其中包括FirstViewModel使用ICalculationService. 该服务可以正常解析并运行,因此我知道 MVVM IoC 正在运行。但我找不到两者之间的任何区别。我无法调试到 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
}

这是我添加的一个单元测试,当它尝试新建 a 时,它立即因空引用异常而爆炸KittenViewModelKittenGenesisService构造函数被调用得很好。

[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 回答