Как подключить ORM к контейнеру IoC? - PullRequest
1 голос
/ 05 марта 2010

искал много информации о разработке IoC / DI, но я не нашел много информации о том, как интегрировать ORM в разработку IoC / DI.

  1. Должен ли IoC знать об ORM?Или наоборот?
  2. Как работает сопоставление конфигурации IoC при сопоставлении «типа ORM»?

Пример:

public class Person : IPerson
{
    private IPersonModel _model;

    public Person(IPersonModel model)
    {
        _model = model;
    }
}    

IoC.Register<IPerson>.As<Person>();    
IPerson = IoC.Resolve<IPerson>();   

Как работает IoC /ORM работает здесь, IPersonModel может быть любым человеком в моей базе данных (или другом хранилище данных)?

Я чувствую, что должен быть метод или подобный:

IPerson = IcO.Resolve<IPerson>(() => PersonId = 50);

Любой, кто хочет объяснитьболее общий, как интегрировать IoC с ORM?

Ответы [ 2 ]

4 голосов
/ 05 марта 2010

Зачем вам нужен класс Person и PersonModel?

Я бы использовал контейнер IoC для разрешения правильного хранилища, которое возвращает правильный IPerson.

Например:

IPersonRepository personRepo = ObjectFactory.GetInstanceOf<IPersonRepository>();
int id = 12;
IPerson person = personRepo.GetBy(id);

Вся ваша логика ORM будет инкапсулирована в вашем хранилище. Подробнее о шаблоне хранилища Здесь

0 голосов
/ 05 марта 2010

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 не нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...