(Запись из памяти)Разрешающая иерархию классов и интерфейсов с Unity
Попытка сделать я в SOL I D. Учитывая
public interface ISettingsReader
{
}
public interface ISettingsWriter : ISettingsReader
{
}
public class SettingsManager : ISettingsWriter
{
}
myContainer.RegisterType<ISettingsWriter, SettingsManager>();
почему следующие жалуюсь что ISettingsReader
не может быть разрешен:
public HomeController(ISettingsReader settingsReader)
{
}
Я бы предположил, что, поскольку я зарегистрировал SettingsManager
, чтобы быть моим ISettingsWriter
, и ISettingsWriter
наследует ISettingsReader
, Unity будет достаточно умным, чтобы выяснить, что SettingsManager
также является ISettingsReader
?
Почему я должен делать в явном виде:
myContainer.RegisterType<ISettingsReader, SettingsManager>();
myContainer.RegisterType<ISettingsWriter, SettingsManager>();
Конечно, он должен быть достаточно умен, чтобы выяснить, что SettingsManager - ISettingsWriter! Это то, что я зарегистрировал. Да, может быть много реализаций для ISettingsReader. Но я зарегистрировал только одно - косвенно. Если бы я зарегистрировал второй, явным образом, я бы ожидал, что он будет разрешен. Если у меня есть цепочка из ста интерфейсов с одной реализацией, мне нужно будет зарегистрировать каждый из них, чтобы я мог использовать их как DI? Это не имеет никакого смысла. –
@HristoYankov Извините, эта часть ответа совершенно неясна, я ее переработаю. Хотя я думаю, что ваш ответ подчеркивает, что если вы ничего не зарегистрировали, как это должно знать, существует ли реализация типа? Насколько я знаю, Unity - это контейнер с прямыми сопоставлениями типа, который не делает неявных преобразований - похоже, что вы ищете что-то, что просто не поддерживает. –
Но дело в том, что оно зарегистрировано. 'B: C ',' A: B' -> 'A: C'. 'if (A is C) {}' даст 'true'. Я уверен, что Unity может пройти через свои зарегистрированные реализации и посмотреть хотя бы на первый, который реализует 'C', нет? Но вы можете быть правы, возможно, Единство просто не поддерживает такое глубокое разрешение. –