2013-06-25 48 views
1

我在YouTube上的教程N=2: Kittens and ListsMvvmCross的IoC无法解析服务

KittenView下面一起被吹起来,当它击中OnCreate()

Cirrious.CrossCore.Exceptions.MvxException:无法加载视图模型从定位MvxDefaultViewModelLocator型MyApp.Core.ViewModels.KittenViewModel

这似乎是不能够解决服务(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 
} 

这是一个单元测试我补充说,它会立即吹了一个空引用异常时,它会尝试新的一个KittenViewModel,该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(); 
    } 
} 

回答

3

我想这可能是值得检查,如果一些基本知识,如:

  • 是有它实现了创服务公共类?
  • 它有一个公共无参数构造函数吗? (或者本身可以构成一个构造函数)

如果这些事情看起来OK,那么它可能值得尝试一些调试技巧:

  • 启用跟踪,这样就可以看到问题的内部细节 - 请参见MvvmCross Mvx.Trace usage
  • 在app.cs中试验一些测试代码 - 在服务注册后,Mvx.CanResolve<IKittenGenesisService>()返回true?
  • 试图从单元测试中调用您的视图模型代码 - 是否可以正常工作?
+0

感谢您的提示。我已经添加了我的KittenGenesisService代码以及单元测试。当试图调用KittenViewModel构造函数时会爆炸。 –

+1

如果真的“爆炸”,那么请张贴视频 - 因为我想看。如果相反,它只是抛出一个异常,然后检查异常错误消息和它抛出的行 - 因为这可能会告诉你什么是实际发生错误....我的猜测是,它将是' string.Format(“http://placekitten.com/{0}/{0}”)' – Stuart

+0

不要以为指出了问题,虽然我有一个类似的单元测试FirstViewModel,它会引发异常一样的地方。在mvvm封面下的东西不让我为单元测试创​​建一个视图模型。 –

相关问题