В моем приложении есть фоновая служба, которая может запускаться независимо от основного приложения (HostApduService).
Как я могу получить доступ / использовать IContainer Prism из этой фоновой службы?
Я знаю, что IContainer доступен из Xamarin.Forms.Application.Current, см.
Однако в моем случае возможно, что приложение не существует, если служба запускается без запуска самого приложения.
Если значение App.Current
равно нулю, у вас есть несколько вариантов.
1) в фоновой службе инициализируйте новый экземпляр приложения:
var app = new App();
app.Container.Resolve<IMyService>();
2) используйте вспомогательный метод, который регистрирует только то, что вы хотите, и создает контейнер, необходимый для вашей фоновой службы:
public class App : PrismApplication
{
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
RegisterBackgroundServices(containerRegistry);
}
public static void RegisterBackgroundServices(IContainerRegistry containerRegistry)
{
// Register services you need in the Background Service
}
}
public class MyBackgroundService
{
IContainerExtension Container { get; }
public MyBackgroundService()
{
// Note: Prism has some non-default Rules in place
Container = new DryIocContainerExtension(new Container());
App.RegisterBackgroundServices(Container);
}
}
Однако следует отметить, что это не контейнер приложения, а отдельный, поэтому для каждого синглтона у приложения есть один, а у службы - другой. Я полагаю, OP ищет способ поделиться контейнером между службой и приложением.
@Haukinger, если у вас действительно есть опыт в том случае, если само приложение не запущено, не имеет значения, что вы используете свой собственный контейнер, если у вас есть правильные регистрации в этом контейнере. Насколько я помню, когда есть активное приложение от Android, у вас должна быть возможность получить доступ к статической ссылке на App.Current
.
Это было бы действительно круто. Я посмотрю на это, когда найду время.
Я могу подтвердить, что когда приложение активно, фоновая служба использует контейнер.
Вы обслуживаете отдельный процесс? Тогда тебе не повезло.