2013-06-25 34 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封面下的東西不讓我爲單元測試創​​建一個視圖模型。 –

相關問題