2012-12-06 7 views
6

DI를 사용하여 개체를 관리하는 방법을 알고 싶습니다. 제가일회용 클래스 관리 Dependency Injection

class Foo : IFoo, IDisposable 
{ 
    // ... 
} 

다음이 클래스가 다른 클래스로 주입되는 클래스가 있다고 가정

class Bar 
{ 
    public Bar(IFoo foo) 
    { 
     this.Foo = foo 
    } 

    IFoo Foo { get; set; } 
} 

는 그럼 (내 예 MVC 및 Ninject에 사용)

this.Bind<IFoo>().To<Foo>().InRequestScope(); 

I 스코프이 바인딩 Dependency Injection 프레임 워크가 Foo의 수명주기를 처리하기 때문에에 IDispoable을 구현해야합니까? 내 생각에 DI는 Foo의 수명주기를 관리하므로 다른 클래스가 Foo을 사용하는 경우이를 만지지 마십시오. 일회용 객체가 생성자 매개 변수로 Bar로 전달되기 때문에, Bar하지 일회용 객체를 않습니다, 그래서 Bar의 호출자가 쓰레기 수집 FooBar 후 사용하고자하는 방법을 알고하지 않습니다. 이게 옳은 거니?

+1

Nicholas Blumhardt는 Autofact를 예로 들었지만 일반적으로 적용 할 수있는 훌륭한 주제가 있습니다. http://nblumhardt.com/2011/01/an-autofac-lifetime-primer/ – fsimonazzi

+0

일부 MSDN 기사를 보면, Microsoft는 두 가지를 모두 수행합니다 : http://msdn.microsoft.com/en-us/library/yhfzs7at%28v=vs.110%29 (StremReader) "StreamReader 개체는 제공된 Stream 개체에서 Dispose()를 호출합니다. StreamReader .Dispose는 " "이라고하지만 http://msdn.microsoft.com/en-us/library/z7ha67kw%28v=vs.110%29 (비트 맵) "비트 맵의 ​​수명 동안 스트림을 열어 두어야합니다. " – Michael

답변

3

예 가정은 정확합니다. Ninject가 개체를 처리합니다.

+0

테스트 할 때 이것을 깨달았습니다. 내 주요 질문은 누가 물체를 폐기 할 책임이 있는지입니다. 검색을 기반으로 한 내 결론은 일회용 개체를 만든 개체가 개체를 처리해야한다는 것입니다. 그래서,이 경우에는 Ninject입니다. – Michael

3

이것은 수명을 관리하는 일반적인 문제입니다. 기본 규칙은 객체를 만드는 사람이 해당 인스턴스의 소유권을가집니다. 소유자는 해당 인스턴스를 처분/파기해야합니다. 소유권을 다른 사람에게 양도 할 수 있습니다. 그러면 다른 사람이 그 인스턴스를 파괴 할 책임이 있습니다.

Foo 인스턴스가 Bar에 의해 만들어지지 않으므로 bar는 해당 인스턴스를 처리 할 책임이 없습니다. Ninject가 당신을 위해 그 인스턴스를 만들었 기 때문에, Ninject는 그 정리를 책임지고 있습니다.

소유권을 양도 할 수는 있지만 명시 적이어야합니다. 이 방법은 새로운 IFoo 인스턴스를 생성

IFoo CreateNewFoo(); 

있지만, 그가 호출자에게 다시 소유권을 전달하는 매우 분명하다 : 명시 적 소유권 전달의 좋은 예는 공장 디자인 패턴입니다.

나쁜 소유권을 넘기는 좋은 예는 .NET의 StreamReader 클래스입니다. 생성자에서 일회용 객체를 사용하지만 소유권이 필요합니다. 문서에 클래스가 주어진 객체를 처리한다고되어 있지만,이 동작은 소유권의 일반적인 규칙을 위반하기 때문에 많은 개발자를 현혹시킵니다. 마이크로 소프트는 마침내 .NET 4.5에서 주어진 스트림의 처리를 억제 할 수있는 ctor 오버로드를 추가하여이 문제를 해결했습니다.

관련 문제