我在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封面下的东西不让我为单元测试创建一个视图模型。 –