Инъекция конструктора в C#/Unity?

Я использую 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' решен?

Я думаю, возможно, использование, названное случаями? Но я в замешательстве. Любая помощь ценилась бы.

Как в стороне, я не создал бы интерфейс ИПЕРСОНА.

16
задан JP Richardson 6 January 2010 в 20:08
поделиться

2 ответа

Одним из способов решения этой проблемы было бы использование инжекторного конструктора с именной регистрацией.

// 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
19
ответ дан 30 November 2019 в 15:12
поделиться
[

] Если вы не зарегистрируете соответственно "joe" и "timmy" как именованные зависимости, вы не можете быть уверены, что "timmy" введен в Schoolbus. На самом деле, если вы попытаетесь зарегистрировать два экземпляра одного класса в качестве неназванных зависимостей, у вас будет неоднозначная установка, и вы вообще не сможете разрешить []Person[].[

] [

]В общем, если вам нужно зарегистрировать много именованных экземпляров, вы, вероятно, пойдёте с DI не так, как надо. Основной идеей DI является разрешение []Domain Services[] более чем []Domain Objects[].[

] [

]Основной идеей DI является предоставление механизма, который позволяет вам разрешать []абстрактные типы [] (интерфейсы или абстрактные классы) [] в конкретные типы []. Ваш пример не имеет абстрактных типов, так что в этом нет особого смысла. [

]
34
ответ дан 30 November 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: