2011-02-14 3 views
4

이것은 DI를 사용하여 처음 시도한 것으로서, ninject를 선택하면 쉬운 학습 곡선이며,이 질문이 있습니다.Ninject에 Dependencies를 어떻게 삽입합니까 (인스턴스가 json에서 deserialize 되는가)

이 같은 개체를 만드는거야 :

var registrants = JsonConvert.DeserializeObject<List<Registrant>>(input); 

나는 현재 직렬화 복원에 주입 저장소 의존성을 가지고있는 최고의 방법을 무엇 Registrant

[Inject] 
public Registrant(IMemberRepository memberRepository) 
{ 
    _memberRepository = memberRepository; 
} 

이 생성자가 개체를 사용하여 Ninject?

답변

6

Ninject에서 생성하지 않은 개체 (예 : 비 직렬화 된 개체)에는 생성자 삽입을 사용할 수 없습니다. 그러나 속성 주입을 사용할 수 있습니다. 그냥 kernel.Inject(obj)

한 가지 질문은 그 개체를 주입하려는 이유입니다. 일반적으로 데이터 컨테이너 객체에 depedency injection을 사용하지 않으려 고합니다. 적절한 디자인에서는 서비스에 대한 의존성이 없습니다. 서비스에서 수행해야하는 작업은 데이터 컨테이너 개체의 소유자가 수행합니다. 디자인 리팩터링을 고려하는 것이 좋습니다.

+2

+1 젠장 당신이 가지고있는 클래스를 가정

가 (있다, 단지 질문을 다시 읽기 -이 명확하게 정답입니다! 필자는 [Inject] 애트리뷰트를 가지고 있고 마술이 작동하지 않는다고 설명하고 예제 코드를 설정하고 asp.net 태그를 보았을 때 문제가 생겼다는 것을 설명하기 시작했다. –

+1

감사합니다. 나는 그 이야기가 될 수 있다고 생각했기 때문에 질문은 매우 개방적이었습니다 :-) 나는 리팩토링에 대한 조언도 취할 것입니다. – Myster

1

Ninject V2를 사용 중이며 ASP.NET 응용 프로그램의 컨텍스트에서 사용하고 있다고 가정하면 연결을 수행하려면 Ninject.Web을 사용해야합니다.

는 그런 다음에 푹 Factory Method support와 글로벌 클래스를 설정 : 모듈을 등록하는

public class Global : NinjectHttpApplication 
{ 
    protected override Ninject.IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(new Module()); 
     kernel.Components.Add(new FuncModule()); 
     return kernel; 
    } 
} 

그 무언가에 BindIMemberRepository이 같은

public class Module : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IMemberRepository>().To<MemberRepository>(); 
     } 
    } 

하고 페이지 전선까지 :

public class ThePage : PageBase 
{ 
    readonly Func<Registrant> _createRegistrant; 

    public ThePage(Func<Registrant> createRegistrant) 
    { 
     _createRegistrant = createRegistrant; 
    } 

    private void OnCreateRegistrant() 
    { 
     var newRegistrant = _createRegistrant(); 
    } 
} 

NB 확실하지 않음 생성자 삽입이 Web Forms 페이지에서 지원되거나 위의 요구 사항이 속성 주입으로 떨어지면 ... 누구입니까? 다음과 같이 :

public class MemberRepository : IMemberRepository 
{ 
} 

public interface IMemberRepository 
{ 
} 

public class Registrant 
{ 
    private readonly IMemberRepository _memberRepository; 
    public Registrant(IMemberRepository memberRepository) 
    { 
     _memberRepository = memberRepository; 
    } 
} 
+0

@Myster : @ Remo의 대답에 대한 저의 코멘트에서 언급했듯이, 사실, 당신이 deserializing하고있는 객체들에 대해 이것을하고 싶습니다. 따라서이 예제는 다른 곳에서 오브젝트를 만드는 데 영향을 미치려고 할 때 사용하지 않을 것입니다. 생성을 간결하게 관리하지 마십시오. 비록 그것이 그렇더라도, 구조적으로 논쟁의 여지가 있습니다. ... –

+0

Thanks @Ruben, 관심사로서 다른 질문에 대답하고 있음을 기억하십시오. 나는 ThePage 클래스를 제외하고 모든 코드를 가지고 있습니다. 거기에 아이디어가 있습니까? 등록자가 어떻게 생겨나게 할 수 있습니까? – Myster

+0

@Myster : 1. 'Ninject.PageBase'에서 파생하여 자동으로 asp.net 페이지에 내용을 넣을 수 있습니다. 2.내가 링크 된 모듈은 객체를 생성하고 의존성에 대한 주입을 수행하는 팩토리를 자동 생성합니다 *. 너 한테 어떻게 말해야하는지 모르겠다. –

관련 문제