Я использую C# со структурой Единства Microsoft. Я не совсем уверен, как решить эту проблему. Это, вероятно, имеет некоторое отношение к моему отсутствию понимания DI с Единством.
Моей проблеме можно подвести итог, используя следующий пример кода:
class Train(Person p) { ... }
class Bus(Person p) { ... }
class Person(string name) { ... }
Person dad = new Person("joe");
Person son = new Person("timmy");
Когда я называю метод твердости на Автобусе, как я могу быть уверен, что Человек 'сын' с именем 'timmy' введен и решая Поезд, как я могу быть уверен, что Человек 'папа' с тогда именем 'joe' решен?
Я думаю, возможно, использование, названное случаями? Но я в замешательстве. Любая помощь ценилась бы.
Как в стороне, я не создал бы интерфейс ИПЕРСОНА.
Одним из способов решения этой проблемы было бы использование инжекторного конструктора с именной регистрацией.
// Register timmy this way
Person son = new Person("Timmy");
container.RegisterInstance<Person>("son", son);
// OR register timmy this way
container.RegisterType<Person>("son", new InjectionConstructor("Timmy"));
// Either way, register bus this way.
container.RegisterType<Bus>(new InjectionConstructor(container.Resolve<Person>("son")));
// Repeat for Joe / Train
] Если вы не зарегистрируете соответственно "joe" и "timmy" как именованные зависимости, вы не можете быть уверены, что "timmy" введен в Schoolbus. На самом деле, если вы попытаетесь зарегистрировать два экземпляра одного класса в качестве неназванных зависимостей, у вас будет неоднозначная установка, и вы вообще не сможете разрешить []Person[
].[
]В общем, если вам нужно зарегистрировать много именованных экземпляров, вы, вероятно, пойдёте с DI не так, как надо. Основной идеей DI является разрешение []Domain Services[] более чем []Domain Objects[].[
] []Основной идеей DI является предоставление механизма, который позволяет вам разрешать []абстрактные типы [] (интерфейсы или абстрактные классы) [] в конкретные типы []. Ваш пример не имеет абстрактных типов, так что в этом нет особого смысла. [
]