#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
передачей всех его зависимостей конструктору вместо методов