Я написал общий интерфейс и со временем, я начал использовать его довольно часто. У меня также была идея фактически предоставить еще один общий интерфейс, расширяющий существующий.C#, Unity IoC: Регистрация и разрешение общих интерфейсов, передовая практика
Теперь, когда я смотрю в моем Unity конфигурации (рамки IoC не имеет значения здесь), это выглядит следующим образом:
container.RegisterType<IConfigProvider<ICountryConfig>, CountryConfigProvider>();
container.RegisterType<IConfigProvider<ILanguageConfig>, LanguageConfigProvider>();
// IEnumerableConfigProvider<T> : IConfigProvider<IEnumerable<T>>
container.RegisterType<IEnumerableConfigProvider<ILocaleConfig>, LocaleConfigProvider>();
// ... repeat gazillion of times...
Использование в зависимости:
public LocaleResolver(IConfigProvider<ICountryConfig> countryConfigProvider, ...)
{
// similar construct all over the place
}
Где ICountryConfig
, ILanguageConfig
,. .. являются интерфейсами, описывающими объекты базы данных. Затем поставщик заботится о предоставлении правильных объектов зависимым компонентам, поэтому доступ к хранилищу хранится на собственном месте.
Проблема возникает, когда я мало рефакторинг. Я использовал случайно родительский интерфейс вместо унаследованного. Он также может быть довольно хрупким при использовании неправильного типа для интерфейса.
Это привело меня к (очевидной) идее, создав еще один слой интерфейсов для инкапсуляции конкретного использования. Это решит проблемы, описанные выше, в другой руке у меня будет триллион пустых интерфейсов для каждой возможной реализации.
// ICountryConfigProvider : IConfigProvider<ICountryConfig>
container.RegisterType<ICountryConfigProvider, CountryConfigProvider>();
// ILanguageConfigProvider : IConfigProvider<ILanguageConfig>
container.RegisterType<ILanguageConfigProvider, LanguageConfigProvider>();
// ILocaleConfigProvider : IEnumerableConfigProvider<ILocaleConfig>
container.RegisterType<ILocaleConfigProvider, LocaleConfigProvider>();
И это уборщик использование:
public LocaleResolver(ICountryConfigProvider countryConfigProvider, ...)
{
// ...
}
И то, что я ищу сейчас хороший совет. Может быть, я слишком сильно злоупотребляю IoC здесь. Каков наилучший подход для проекта среднего размера?
Я знаю эту тему, возможно, в конечном итоге с обсуждения, а не конкретный ответ, я извиняюсь за это дорогой StackOverflow.
Вы считали [регистрацию открытых дженериков] (https://msdn.microsoft.com/en-us/library/dn178463 (v = pandp.30) .aspx # sec13)? – TylerOhlsen
Не совсем, не представляю, как это может мне помочь в этом случае. –