2013-04-30 2 views
3

이것이 가능한지 확실치 않지만 런타임에 Ninject를 사용하여 인터페이스를 구체 구현으로 채우는 Entity Framework를 사용하여로드하고 저장할 수있는 클래스를 갖고 싶습니다. Ninject를 EntityFramework Entity 객체에 사용할 수 있습니까?

는이 같은 생성자 시작 : 이것은 지금까지 Ninject에 간다 작동

public FancyObject(ICatProvider kitty) 
    { 
     this.kitty = kitty; 
    } 

, 우리는 고양이를 얻을 - 그것은 엔티티 프레임 워크를 사용하여 SQLServer입니다 엔티티를 저장하기 위해 작동합니다. 그러나 Entity Framework에 매개 변수없는 생성자가 필요하기 때문에 엔터티를로드하려고 할 때 오류가 발생합니다.

그래서 나는이 같은 속성에 퍼팅 시도 :

[Inject] 
    public ICatProvider kitty { get; set; } 

    public FancyObject() 
    { 
    } 

이것은 DB에서로드 할 수 있지만, 키티는 항상 null입니다. 바인딩에

내가 가진 모든입니다 : 내가 엔티티를 생성 할 엔티티 프레임 워크를 사용하고 있는데 그렇게해서 Ninject가의 모양을 받고 있지 않기 때문에이 추측하고있어

kernel.Bind<ICatProvider>().To<FancyFileBasedCat>(); 

.

내가 여기에 명백한 것을 놓치고 있습니까? 이것을 할 수있는 좋은 방법이 있습니까?

답변

5

당신의 추측이 맞습니다. 귀하의 속성입니다 null 이유는

". 엔티티를 생성하기 위해 엔티티 프레임 워크를 사용하는 등 Ninject에이의 모습을받지 못하고있다" 기존 인스턴스에 종속성을 주입하는 Kernel.Inject 방법 (wiki)를 사용할 수 있습니다 그러나

:

var fancyObject = db.GetFancyObject(); 
kernel.Inject(fancyObject); 
// fancyObject.kitty should be filled in. 

엔티티는 일반적으로 종속성을 가지는 코드 냄새 어쩌면 당신은 당신의 디자인을 재고해야한다. 필요할 때 서비스를 전달

  • : 같은 기관에서 종속성을 피하기 위해 방법이 많이 있습니다

    public class FancyObject 
    { 
        public Result MethodWorkingWithCats(int somearg, ICatProvider kitty) 
        { 
          reuturn DoSoemThing(this, somearg, kitty) 
        } 
    } 
    
  • FancyObject
  • 으로 ICatProvider에 dependy과에 작동하는 FancyObjectService를 만들기/
+0

예, 아마도 가장 세련된 디자인이 아닙니다. 수동으로 각 인스턴스를 주입해야 할 필요가 있습니다. 그것은 냄새 나는 의존성 때문에 만 필요합니다. 나는 당신이 옳다고 생각합니다. 더 높은 차원에서 그것을 주입하고 필요에 따라 엔티티로 전달하는 것이 더 나은 해결책 일 수 있습니다. 감사. – Kaine

관련 문제