Регистрация против RegisterInstance против RegisterSingleton в Призма 7 DI - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь зарегистрировать службу для DI в Prism 7. Я считаю, что все следующие методы работают, как правильно это сделать? В чем дело для каждого?

public class AndroidInitializer : IPlatformInitializer
{
    static OpenAppService openAppService = new OpenAppService();

    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterInstance<IOpenAppService>(openAppService);

        containerRegistry.Register<IFacebookLoginService, FacebookLoginService>();

        containerRegistry.RegisterSingleton<IAppleSignInService, AppleSignInService>();

    }
}

1 Ответ

0 голосов
/ 04 апреля 2020

Прежде всего, то, что делает каждый из этих методов, полностью зависит от используемого контейнера, особенно когда вы go выходите за рамки тривиальных вещей. Вероятно, это основная причина, по которой нет документации для этого материала.

При этом ...

  • Register говорит, что данный сервис следует использовать, когда данный интерфейс и для каждой отдельной инъекции будет создан новый экземпляр.
  • RegisterSingleton отличается тем, что один и тот же экземпляр используется для всех инъекций.
  • RegisterInstance совпадает с RegisterSingleton, но вы должны предоставить экземпляр.

Какой правильный способ сделать это? В чем дело для каждого?

Итак, большую часть времени службы регистрируются как одиночные, потому что вы хотите, чтобы модели представления могли общаться через службу. Пример: EventAggregator - когда одно представление модели публикует событие, вы ожидаете, что другие получат его, что возможно только в том случае, если они подписываются, используя тот же экземпляр, на который публикует издатель. Клиент WCF, тем не менее, не обязательно должен быть одноэлементным, потому что связь происходит на стороне сервера.

Вы не хотите регистрировать экземпляры, потому что это смешивает регистрацию и разрешение, и вы должны убедитесь, что все зависимости экземпляра уже зарегистрированы при создании экземпляра для его регистрации (посредством вызова Resolve, который сам по себе имеет злое прикосновение). Это меньше проблем, если вы регистрируете все в одном методе, но становится гораздо большей головной болью, если у вас есть несколько (взаимозависимых) модулей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...