#c#
#c#
Вопрос:
Удивительно, но я не вижу, чтобы этот вопрос уже был указан в stack overflow.
У меня есть интерфейс, определенный как таковой:
IDatabaseRepository<in T> where T : DatabaseConfigBase
У меня есть несколько реализаций, таких как:
MongoDatabaseRepository<in MongoDatabaseConfig>
MySqlDatabseRepository<in MySqlDatabaseConfig>
У меня также есть фабрика, которая возвращает мне требуемый репозиторий, поэтому я могу проверить правильность базы данных в соответствии с конфигурацией во время выполнения:
class RepositoryFactory
{
public RepositoryFactory(IEnumerable<IDatabaseRepository> dbImplementations)
public IEnumerable<IDatabaseRepository<>> Create(string dbName)
}
Этот последний класс недопустим, потому что я не могу принять IEnumerable только для IDatabaseRepository. Компилятор требует, чтобы я указал IDatabaseRepository<T>
, но я не знаю, каким будет T ? Мне нужен список всех моих реализаций, независимо от их T!
Есть ли какое-либо решение, кроме упаковки и распаковки всего в и из (объекта)?
Комментарии:
1. Обычное действие состоит в том, чтобы создать нестандартный интерфейс в вашей иерархии, например ,
IDatabaseRepository<T> : IDatabaseRepository
, а затем сделать его своим элементом списка. Это несовершенно, но дает вам больше ограничений, чем просто использование object.2. @AnthonyPegram Однако, это довольно часто запах кода, особенно если это пустые интерфейсы (часто называемые интерфейсами маркеров), и я бы предположил, что в этом случае они вонючие.
3. @DavidG Это не обязательно должны быть пустые интерфейсы. Вы можете заставить неродовой интерфейс предоставлять сигнатуры методов, используя
object
type вместо параметра generic type .4. Даже если бы у вас был список
IDatabaseRepository<>
, как бы вы его использовали? Боюсь, мы недостаточно знаем о вашей проблемной области, чтобы предложить лучшую альтернативу.5. @DavidG — Знаешь что, я думаю, ты прав. Я пытаюсь выполнить это кодирование за слишком маленькие временные блоки, между слишком многими встречами, мне нужно остановиться и переосмыслить эту архитектуру. Спасибо.