我在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();
}
}
感謝您的提示。我已經添加了我的KittenGenesisService代碼以及單元測試。當試圖調用KittenViewModel構造函數時會爆炸。 –
如果真的「爆炸」,那麼請張貼視頻 - 因爲我想看。如果相反,它只是拋出一個異常,然後檢查異常錯誤消息和它拋出的行 - 因爲這可能會告訴你什麼是實際發生錯誤....我的猜測是,它將是' string.Format(「http://placekitten.com/{0}/{0}」)' – Stuart
不要以爲指出了問題,雖然我有一個類似的單元測試FirstViewModel,它會引發異常一樣的地方。在mvvm封面下的東西不讓我爲單元測試創建一個視圖模型。 –