我目前正在开发WP 8.1应用程序(运行时,而不是silverlight),我想找到一个IoC容器。我正在使用Caliburn.Micro,这很好,因为它在视图模型中使用构造函数注入,但我还有一个后台代理,它不能从Caliburn.Micro中获取IoC容器。
在我的应用中,我可以这样做:
...
public MyViewModel(ISyncService syncService, IOtherService otherService)
{
_syncService = syncService;//and so on for all services
}
或类似的东西:
var syncService = IoC.Get<ISyncService>();
在我的经纪人中,我不能做同样的事情,因为Caliburn在那里没用,所以我不得不做这样的事情:
var syncService = new SyncService(new AppSettings(), new AuthenticationService(webClient),
new PromotionalMessagesService(webClient)...));
我认为你明白了。 ISyncService在构造函数中需要7个服务,并且每个服务在其ctor中都有更多。除了丑陋的代码之外的另一个缺点是,如果我在服务的ctor中更改某些内容,我必须每次都在这里更新它。
你知道WP 8.1的任何好的IoC容器,或者你对这个问题有更好的想法吗?
答案 0 :(得分:1)
我使用MvvmLight Toolkit中的SimpleIoc
。
在这里可以找到一个好的方法: how to use MVVMLight SimpleIoc?
答案 1 :(得分:1)
如果查看“支持的.NET版本”表of this page,您将看到以下DI库支持WP8.1:
答案 2 :(得分:0)
我不认为这是IoC容器的错误。如果单独调用后台代理程序到主应用程序,则可能必须为该进程配置所需的依赖项。在autofac的情况下,您可以重用模块来注册所需的依赖项,然后构建容器。这些只是粗略的手工编码片段:
var builder = new ContainerBuilder();
builder.RegisterModule<ServicesModule>();
backgroundTaskContainer = builder.Build();
在OnInvoke方法中,您可能只需要使用实例范围(http://docs.autofac.org/en/latest/lifetime/instance-scope.html)来隔离调用调用,或者在处理任务时只处置容器本身。
protected override void OnInvoke(ScheduledTask task)
{
using(var scope = backgroundTaskContainer.BeginLifetimeScope())
{
var sync = scope.Resolve<SyncService>();
}
}