适用于Windows Phone 8.1的IoC容器

时间:2015-05-13 12:16:37

标签: windows-phone-8.1 inversion-of-control ioc-container caliburn.micro

我目前正在开发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容器,或者你对这个问题有更好的想法吗?

3 个答案:

答案 0 :(得分:1)

我使用MvvmLight Toolkit中的SimpleIoc

在这里可以找到一个好的方法: how to use MVVMLight SimpleIoc?

答案 1 :(得分:1)

如果查看“支持的.NET版本”表of this page,您将看到以下DI库支持WP8.1:

  • Autofac
  • Catel
  • DryOic
  • Endjin作品
  • 格雷斯
  • HaveBox
  • IfInjector
  • LightInject
  • 无限
  • Munq
  • Ninject
  • 简单注射器
  • TinyIoc
  • 统一

答案 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>();
  }
}