2014-12-17 3 views
2

Windows 서비스에서 클래스 인스턴스를 얻는 방법은 무엇입니까?Autofac 컨테이너를 사용하여 유형의 인스턴스를 해결하는 방법?

분명히 새로운 인스턴스는 DI의 모든 목적을 결함시킬 것입니다. 옛날에, 하나이 경우

ISomeInterface st = container.Resolve<ISomeInterface>();

할 것, ISomeInterface를 구현하는 클래스는 생성자 예에 종속 클래스/인터페이스를 가지고 SomeInterfaceImp(IOtherInterface oi)().

autofac으로 어떻게 할 수 있습니까?

답변

5

이것은 꽤 일반적인 표준 종속성 해결/자동 와이어 업 구성입니다. 컨테이너에 모든 종속성이있는 한 ISomeInterface을 확인하면 IOtherInterface과 같은 종속성도 자동으로 연결됩니다.

var builder = new ContainerBuilder(); 
builder.RegisterType<SomeInterfaceImp>().As<ISomeInterface>(); 
builder.RegisterType<OtherInterfaceImp>().As<IOtherInterface>(); 
var container = builder.Build(); 

There is a good getting started guide on Autofac with lots of examples on the Autofac doc site. 거기에서 시작하는 것이 좋습니다.

장기 실행 Windows 서비스 (태그에서 제안한대로)를 작성하는 경우 메모리 누수가 발생할 수 있으므로 컨테이너에서 물건을 찾아서는 안됩니다. There is plenty of documentation about this as well.

+0

응답 해 주셔서 감사합니다. 제가이 질문을하는 이유는 autofac에 관한 대부분의 예제가 프레임 워크에 통합되어 있다는 것입니다. 예 : MVC/web api/webform은 httphandler/filter를 사용하여 DI 용 프레임 워크에 자체적으로 연결되지만 특정 클래스의 인스턴스를 가져 오는 것과 같은 나머지 프로그래밍 구조에서는 Windows 서비스에서 작업하는 것처럼 보입니다. 응용 프로그램에서 사용할 컨테이너의 전역 참조를 만들어야하는 경우 이는 서비스 로케이터 패턴과 매우 유사합니다.이 경우에는 새로운 종속성이 도입됩니다. – koo9

+0

Windows 서비스, WinForms 응용 프로그램 및 DI가 프레임 워크에 구워지지 않은 다른 응용 프로그램에서는 올바르게 작동합니다. 수동으로 직접 통합 할 수 있습니다. 거기에 "권장 패턴"이 없습니다. –

+0

이 문제는 범위 문제입니다. 스레드마다 인스턴스를 설정한다고 가정 해 봅시다. 인스턴스를 확인할 때 다음과 같이해야합니다. 범위가 삭제되면 (var scope = container.BegineLifetimeScope()) {Isomeinterface instance = scope.Resolve ();} IDiposable 인터페이스를 구현하는 모든 인스턴스를 처리하십시오. 이 스레드/InstancePerLifetimeScope 당 인스턴스의 목적을 패배, 그렇지 않습니까? – koo9

관련 문제