2015-01-02 7 views
1

Autofac + MVC5를 사용하여 컨트롤러 종속성을 해결하는 기본 사항을 살펴 보았습니다. 그러나 서비스에 종속성을 주입하는 방법에 대해 궁금합니다.Autofac + MVC5 : 서비스 의존성 해결

샘플 정의가 주어지면 필요한 종속성을 해결하는 Autofac을 사용하여 클래스의 인스턴스화 된 복사본을 만들거나 가져올 수 있습니까?

Bar : IBar 
{ 

    Public Bar(IFoo foo, IPanda panda) 

{} 


} 
+0

MVC에서 Autofac을 통합하기위한 몇 가지 단계가 있습니다 (http://docs.autofac.org/en/latest/integration/mvc.html). 어디서 붙어 있었 니? – Win

+0

나는 Autofac를 통합했다. 컨트롤러가 아닌 객체에 종속성을 주입하는 방법에 대해 궁금합니다. –

+0

예 : 서비스 C에 서비스 A와 B를 주입하므로 C가 자체적으로 할 수 있습니다. –

답변

1

궁극적으로 그것은 컨테이너에 유형을 등록하는 것입니다. 예 :

var builder = new ContainerBuilder(); 
builder.RegisterType<Bar>().As<IBar>(); 
var container = builder.Build(); 

초기화 중에 어딘가에서 Builder를 사용하는 유사한 코드가 있다고 가정합니다. Autofac이 컨트롤러를 인스턴스화하려고 할 때마다 모든이 등록되면 http://docs.autofac.org/en/latest/register/registration.html

,이 컨트롤러의 생성자를 검사합니다 :

는 등, 여기에 더 많은 정보가 의존성, 수명, 인터셉터를 등록하고 구성하는 여러 가지 방법이 있습니다 의존성으로 IBar을 찾으면 컨테이너 등록을 찾고 이에 따라 인스턴스를 생성합니다.

IBar을 인스턴스화 할 때 동일하게 적용되면 IFooIPanda이 표시되며 동일한 프로세스가 반복됩니다.

가장 큰 차이점은 Autofac이 컨트롤러의 자동 등록을 지원한다는 것입니다. 단지 수동으로 컨트롤러를 등록하는 번거 로움을 덜어줍니다.

결국 결국 모든 필요에 따라 종속성이 생성됩니다. 의존성을 직접 요청하여 ServiceLocator 스타일의 인스턴스화를 사용하지 않고, Autofac이 생성 중에 종속성을 제공하도록하는 경향이 있습니다.

+0

대단히 감사합니다! 이것은 내 마음 속에 블록을 정리하는 데 도움이되었습니다. 여전히 "DependencyResolver.Current.GetService ();"을 호출해야합니다. " 서비스의 복사본을 얻으려면 전달 된 모든 생성자 서비스가 자동으로 인스턴스화됩니다. 나는 클래스의 복사본을 인스턴스화하고 있지만 실제로 구현하는 인터페이스는 사용하지 않습니다. 이것은 내 코드를 많이 정리합니다. :) –

+1

음, 반드시 DependencyResolver를 호출 할 필요는 없습니다. 내 컨트롤러가 IBar에 의존성이 있다면 GetService를 호출 할 필요없이 자동으로 제공됩니다. 같은 종류의 종속성 체인에 적용됩니다. 나는 일반적으로 GetService를 수동으로 호출하지 않고도 전체 앱을 빌드 할 수 있습니다. 이는 ServiceLocator의 일을하는 방식입니다. –

+1

디자인 레이아웃을 크게 수정했을 때 "GetService"가 많은 코드를 제거 할 수있었습니다. 조언 감사합니다 :) –