ORM имеет сеанс (или как там его называют) для загрузки сущностей. Сеанс действительно может быть введен структурой DI.
Итак, в вашем примере с Hibernate
вы можете получить что-то вроде:
class Service {
Session session; // could be injected by DI
...
Person p = (Person) session.load( typeof(Person), 50 );
}
Отображение объекта в ORM не зависит от конфигурации IoC.
Объекты в ORM хранят данные самым простым способом. Обычно вам не нужно иметь интерфейс для вашей сущности.
public class Person
{
Integer id;
String name;
// getter and setter for the values
}
Картирование может быть выполнено различными способами. Идея состоит в том, что вы сопоставляете свойства класса со столбцами в базе данных. Вот выдержка из конфигурации с hibernate
.
<class name="Person"
table="PERSON" >
<id name="id" column="PERSON_ID">
<generator class="native"/>
</id>
<property name="name" column="NAME" />
...
</class>
Это были только общие идеи (извините, если есть ошибки). Детали будут зависеть от используемого IoC / DI, а также от ORM.
EDIT
Вот что я имел в виду в своем комментарии:
abstract class Person {
abstract Presenter GetPresenter();
...
}
class Person1 : Person {
Presenter GetPresenter() { return new PresenterForPerson1() }
...
}
// other subclasses
Вы не используете IoC для загрузки сущностей, вы используете сеанс / репозиторий.
Person person = session.Load( typeof(Person), 50 );
ORM поддерживает полиморфные сущности. Таким образом, загруженный объект person
может иметь конкретный тип Person1, Person2
и т. Д.
Чтобы получить presenter
для person
, вы используете
Presenter presenter = person.GetPresenter();
Это просто ОО.
Для тестирования вы можете создать подкласс PersonX
с помощью PersonXTest
и переопределить GetPresenter
для возврата ложного докладчика. Затем вы изменяете конфигурацию ORM на пользователя PersonXTest
вместо PersonX
для тестирования. Тогда DI не нужен.