использование службы локализации для получения всех языков из component composer, неверный DI?

#c# #dependency-injection #interface

#c# #внедрение зависимостей #интерфейс

Вопрос:

У меня есть интерфейс, как показано ниже, который я использую для добавления определенного языка, если он не существует:

 public interface IGetLanguagesService
    {
        void GetLanguages(ILocalizationService localization);
    }


    public class LanguageService : IGetLanguagesService
    {
        ILocalizationService _localizationService;
        public void GetLanguages(ILocalizationService localization)
        {
            _localizationService = localization;
            var currentLanguages = _localizationService.GetAllLanguages();
            bool exists = false;
            foreach (var currentLan in currentLanguages)
            {
                if (currentLan.IsoCode == "es-ES")
                {
                    exists = true;
                }
            }
            if (!exists)
            {
                AddLanguage(_localizationService);
            }
        }

        public void AddLanguage(ILocalizationService localization)
        {
            var languageSE = new Language("es-ES") { CultureName = "es-ES", IsMandatory = true };
            localization.Save(languageSE);
        }
    }
 

Я хочу использовать это при запуске, поэтому создал component composer, который при инициализации () я хочу вызвать CallGetLanguages(), но я не совсем уверен, что должно быть в Initialize(), я думаю, что мой DI может быть неправильным?

    public class LanguagesComposer : ComponentComposer<LanguagesComponent>
        {
            public void Compose(Composition composition)
            {
                composition.Register<IGetLanguagesService>(Lifetime.Singleton);
                composition.Register<ILocalizationService>(Lifetime.Singleton);

                composition.Components().Append<LanguagesComponent>();
            }
        }

        public class LanguagesComponent : IComponent
        {
            public void Initialize()
            {
               ???????
            }

            public void Terminate()
            {
                throw new NotImplementedException();
            }

            IGetLanguagesService _getLanguagesService;
            ILocalizationService _localization;
            public void CallGetLanguages(IGetLanguagesService getLanguages, ILocalizationService localization)
            {
                _getLanguagesService = getLanguages;
                _localization = localization;
                _getLanguagesService.GetLanguages(localization);
            }


}
 

Ответ №1:

Вы передали ILocalizationService localization экземпляр LanguageService дважды, передайте его конструктору вместо этого и используйте инъекцию конструктора. Та же проблема с LanguagesComponent передачей всех его зависимостей конструктору вместо методов