1

В настоящее время я работаю над приложением WP 8.1 (время выполнения, а не silverlight), и я хочу найти контейнер IoC. Я использую Caliburn.Micro, это здорово, потому что он использует конструкторную инъекцию в моделях просмотра, но у меня также есть фоновый агент, который не может получить доступ к контейнеру IoC от Caliburn.Micro.Контейнер IoC для Windows Phone 8.1

В моем приложении, я могу сделать что-то вроде этого:

... 
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 сервиса, я должен обновлять его здесь каждый раз.

Знаете ли вы хороший контейнер IoC для WP 8.1 или, может быть, у вас есть лучшая идея для этой проблемы?

ответ

1

Если вы посмотрите на "Поддерживаемые версии .NET" таблицы of this page, вы увидите, что следующие библиотеки DI поддерживают WP8.1:

  • Autofac
  • Катель
  • DryOic
  • Endjin Состав
  • Грейс
  • HaveBox
  • IfInjector
  • LightInject
  • Mugen
  • Munq
  • Ninject
  • Простой Injector
  • TinyIoc
  • Единство
+0

Спасибо, я не знал об этом. Я думаю, что попробую Autofac и посмотрю, как это работает. – thewindev

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