2010-03-05 2 views
1

은 IoC/DI 개발에 대한 많은 정보를 찾고 있었지만 IoC/DI 개발에 ORM을 통합하는 방법에 대한 정보는 많이 찾지 못했습니다.ORM을 IoC 컨테이너에 연결하는 방법은 무엇입니까?

  1. IOMC가 ORM에 대해 알고 있어야합니까? 혹은 그 반대로도?
  2. "ORM 유형"을 매핑 할 때 IoC 구성 매핑이 어떻게 작동합니까?

예 :

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); 

사람은 ORM와 IOC의를 통합하는 방법보다 일반적인 설명 하시겠습니까?

+0

어떻게하면됩니까? – Marcus

답변

4

왜 Person 클래스와 PersonModel이 필요합니까?

IoC 컨테이너를 사용하여 올바른 IPerson을 반환하는 적절한 저장소를 확인합니다. 예를 들어

: 당신의 ORM 논리의

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

모든 저장소에 캡슐화된다. 저장소 패턴에 대한 추가 정보 Here

+0

GetBy 메서드는 다음과 같이 해결해야합니다. IcO.Resolve () 및 다음 속성 설정 또는? 저장소 패턴과 DI 패턴을 결합 할 수 있습니까? – Marcus

+0

IoC 컨테이너에서 올바른 저장소를 가져 오면됩니다. 저장소가 반환하는 모든 유형의 사람이 데이터 원본에서 되돌아 오는 것을 기반으로한다고 가정합니다. 따라서 저장소는 ConcretePerson1 또는 ConcretePerson2 유형을 반환 할 수 있습니다. 그게 무슨 뜻이야? – Wix

+0

아, 설명해 주셔서 감사합니다. – Marcus

0

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> 

이것은 일반적인 아이디어였습니다 (실수가 있으면 죄송합니다). 세부 사항은 당연히 ORM뿐 아니라 사용하는 IoC/DI에 따라 달라집니다.

편집 여기

내가 내 댓글에 의미하는 것입니다 : 당신 실체를로드하는 IOC의를 사용하지 않는

abstract class Person { 
    abstract Presenter GetPresenter(); 
    ... 
} 

class Person1 : Person { 
    Presenter GetPresenter() { return new PresenterForPerson1() } 
    ... 
} 

// other subclasses 

, 당신은 세션/저장소를 사용합니다.

Person person = session.Load(typeof(Person), 50); 

ORM은 다형성 엔티티를 지원합니다. 그래서로드 된 person 객체가 personpresenter을 얻으려면 등 구체적인 유형 Person1, Person2

을 가질 수 있습니다, 당신은 일반 OO있어

Presenter presenter = person.GetPresenter(); 

를 사용합니다.

테스트의 경우 PersonXPersonXTest으로 서브 클래 싱하고 GetPresenter을 무시하여 모의 발표자를 반환 할 수 있습니다. 그런 다음 테스트 용으로 PersonX 대신 ORM 구성을 사용자 PersonXTest으로 변경합니다. DI는 필요 없습니다.

+0

설명하기가 어려우나 IPersonModel (ORM 엔티티)에 의존하는 PersonPresenter가 있다고 가정 해 봅시다. 어떻게하면 필자의 코드에서 PersonPresenter를 특정 person-entity로 해결할 수 있습니까? IoC.Resolve () <-? – Marcus

+0

내가 무슨 뜻인지 잘 모르겠다. 그러나 서로 다른 구체적인 Person 유형을 가질 수 있고 각 Person에 대한 표현자가 있다면 가장 쉬운 방법은 사용할 각기 다른 Person 클래스에 getPresenter()를 추가하는 것입니다. 이 경우에는 DI를 사용할 필요가 없으며 일반 OO/다형성이 작동해야합니다. – ewernli

+0

내가 말하는 의미는 IoC.Resolve ()를 사용할 수 없다는 것입니다. 왜냐하면 발표자는 orm 엔티티 인 사람 모델에 의존하기 때문입니다. 어딘가에 나는 사람 모델 (orm 엔티티)에 대해 원하는 ID를 지정해야합니다. 그래서 IoC.Resolve () 대신 IoC.Resolve () .GetPresenter (id : 50)를 사용해야합니다. – Marcus

관련 문제