3

Entity Framework CTP5에서 IOC 컨테이너를 통해 검색된 지속 된 엔터티를 구성 할 수 있습니까?Entity Framework CTP5 및 Ninject를 IOC로 사용

저는 Ninject를 사용하고 있으며 MVC로 잘 묶여 있지만 일부 비즈니스 규칙에 맞게 구성 할 때 일부 도메인 개체에 서비스를 주입해야합니다.

나는 메소드 나 속성 주입보다 생성자 주입을 사용하여이 작업을 수행하고 싶습니다.

답변

1

정확하게 여기 무엇을 하려는지 정확히 모르겠지만 EF에는 거의 확장 점이 없습니다. 당신이 할 수있는 최선의 방법은 ObjectContext에 의해 시작된 ObjectMaterialized 이벤트에 연결하는 것입니다. CTP5, 당신은 당신의 DbContext의 생성자에서 다음처럼 DbContext 캐스팅해야합니다

((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += 
    this.ObjectContext_OnObjectMaterialized; 

그리고이 함수 ObjectContext_OnObjectMaterialized(object sender, ObjectMaterializedEventArgs e)를 구현합니다. 불행히도 이미 구체화 된 객체에 액세스 할 수 있습니다. 필요에 따라 여기에서 흥미로운 행동을 해킹 할 수 있습니다.

은 BTW,이 문장은 나에게 아무 의미 : 그들은 일부 비즈니스 규칙에 대한 건설 할 때 나는 내 도메인 객체로 일부 저장소를 주입 할 필요가

.

지속성 무시 도메인 객체에 대해 적용되지 않습니까?

+0

단어 저장소가 서비스 여야합니다 (원본을 업데이트했습니다). 예를 들어 도메인 객체에는 몇 가지 전자 메일 전송 기능이있을 수 있으므로 구성시 전자 메일 서비스를 주입하려고합니다. – WDuffy

+0

@WDuffy - 의미가 있습니다. 불행하게도, MS 포럼의이 응답 (http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/c33019e9-2ac4-4cc6-9e0b-3c6557fbf0a6)은 EF가 0 인수 생성자를 필요로하기 때문에 POCO를 구체화하면 고전적인 생성자 삽입을 사용할 수 없습니다.유일한 해결 방법은 1)이 생성자를 내부로 만들고 2)이 생성자가 IoC 컨테이너에 의해 해결 된 HAS 인수를 갖는 생성자를 호출하도록 만드는 것입니다. 이것은 불행히도 IOC에 대한 우려로 POCO를 오염시킵니다. – anon

+0

ICustomerRepository 인터페이스는 지속성을 무시합니다. DDD 청서를 읽는다면 에릭 에반스는 몇 가지 상세한 시퀀스 다이어그램을 보게 될 것입니다. 진정한 데이터 액세스 객체가 아닌 리파지토리 인 경우 저장소의 요점입니다. 나는 개인적으로 내 집계에서 저장소 인터페이스를 사용하며 훌륭하게 작동합니다. –

1

나는 당신이하려는 것을 반대로하는 경향이 있습니다. 내 도메인 객체를 가능한 한 무식한 것으로 만듭니다 (그들은 본질적으로 속성 가방입니다). 전자 메일을 보내는 것과 같은 일종의 작업을 수행해야하는 경우 해당 서비스를 사용하고 해당 메서드가 작업을 수행하는 데 필요한 도메인 개체를 가져 오게합니다. 이 경우 응용 프로그램의 여러 부분에 서비스를 주입하면됩니다 (Ninject를 사용하여 수행하는 것이 훨씬 간단합니다).

+0

약간 주제 떨어져 : "재산 부대"는 경보적이다. 이는 빈혈 영역을 만들 위험이 있음을 의미합니다. 매우 화제가 아닙니다 : 차가운 아바타 =) – anon

+0

나는 양쪽에 이익을보고 (어느 정도는 양면을 주장한다). 나는 객체에서 단순한 검증을 유지하는 경향이있다. 그래서 그 의미에서 그들은 엄격하게 속성 가방이 아니라고 생각한다. 그러나 객체가 충분히 복잡하다면 비즈니스 로직을 두는 것은 클래스를 빠르게 팽창시킬 것이고, 그것은 1,000 라인 코드 (나는 그것이 많이 일어나는 것을 보았다). "비즈니스 논리"라는 단어를 생각할 때 복잡한 일련의 규칙을 생각하는 경향이 있습니다. 그렇다면 별도의 클래스를 선호합니다. 단순히 유효성 검사 만 수행하면 클래스에 넣는 것이 타당합니다. 항상 Black Mage를 사랑했습니다! –

+0

+1. 나는 정확히 동일하다. 나는 POCO를 거의 로직이없는 상태로 유지하고있다. (매우 간단한 setter 유효성 확인은 여기저기서 제외된다.) 전자 메일 전송과 같은 우려는 실제로 서비스 계층에 속한다. 도메인 객체에 서비스를 주입하는 것은 반 직관적 인 것처럼 보인다. –

0

EF 코드는 처음 CTP 5가 도움이 될 수 있다고 생각합니다. ValidationContext 객체를 인수로 취하는 IValidatableObject 인터페이스를 사용합니다. ValidationContext는 ServiceLocator이므로 validationContext 객체를 사용하여 IoC 컨테이너의 인스턴스를 가져올 수 있어야합니다. (이것은 단지 초기 생각이고, 나는 아무것도 시도하지 않았다). 미안, 내 영어가 이해할 수 없다면.

업데이트 죄송합니다.이 의견을 게시 한 직후에 나는 그 질문이 내가 이해 한 것과 상당히 다른 것을 깨달았습니다. 그래서, 나는 몇 가지 일을 혼자 시도했고, 몇몇 히트와 재판과 훨씬 더 많은 인터넷 검색을 통해 나는 어딘가에 도착할 수있었습니다. 대답은 매우 길기 때문에 여기서 대답을 게시 할 계획 이었지만 반대 의견을 제시했습니다. 그래서 나는이 블로그를 대신 게시했다.

http://nripendra-newa.blogspot.com/2011/02/entity-framework-ctp5-injecting-with.html

는이 같은 검색 일부 Google 직원이 도움이 될 수 있음. 이번에는 의문이 생길 것입니다.

관련 문제