2012-07-17 2 views
1

방금 ​​시작한 ninject -이 문제는 해결할 수 없습니다. 이 설정을 고려 : 로그를InRequestScope로 주문 처분

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<IDataTransaction>().To<DataTransaction>().InRequestScope(); 

    kernel.Bind<IdbAnalytics>().To<dbAnalytics>().InRequestScope(); 
    kernel.Bind<IdbMembership>().To<dbMembership>().InRequestScope(); 

    kernel.Bind<IAnalyticsWork>().To<AnalyticsWork>().InRequestScope(); 
    kernel.Bind<IMembershipWork>().To<MembershipWork>().InRequestScope(); 

    kernel.Bind<ILog>().To<Log>().InRequestScope(); 
    ... 
} 

은 상기 클래스에 주입되고 :

public class AnalyticsWork : IAnalyticsWork, IDisposable 
{ 
    private readonly IdbAnalytics _Context; 
    private readonly ILog _Log; 

    public AnalyticsWork(IdbAnalytics Context, ILog Log) 
    {    
     _Context = Context; 
     _Log = Log; 
     _Log.Write(LogEntryType.DEBUG, "Object Created"); 
    } 
    ... 
} 

이 문제는 로그 객체가 다른 객체에 앞서 폐기 도착이다 (AnalyticsWork/MembershipWork). 항목을 폐기해야하는 순서를 설정할 방법이 있습니까? 또는이 설정에 결함이 있습니까?

+0

이것은 클래스가 디자인 상 결함처럼 보이는'Dispose' 메서드 내에서'ILog'를 호출하는 경우에만 문제가 될 것입니다. dispose 메소드에서는 가능한 한 작게 수행해야합니다. 그렇지 않으면'Log' 클래스 싱글 톤을 만드십시오. – Steven

답변

2

나는 NInject를 사용하지 않지만 Log Concrete를 공유 또는 웹 요청으로 등록한다는 소리를 들었습니다. (InRequestScope에 따르면, 다시 NInject를 사용하지 않는 것에 대해 사과합니다. 그).

NLog, Log4Net, Logging Application Block 등 모든 로그 작성자의 경우 로그에 쓰기 위해 수퍼 클래스를 사용하기 때문에 Transient이 아닌 Transient 등록이 필요합니다. 호출 클래스.

주문을 처분하는 한, 다른 클래스가 여전히 의존하고있는 경우 오브젝트를 다른 순서로 처분 할 수 없으므로 IoC 컨테이너로 제어 할 수 없다고 생각합니다. 몇 년 전 IoC 컨테이너로 처음 시작했을 때 같은 문제가 발생하여 "그래, 모든 것을 범위로 등록하겠습니다!"라고 생각했습니다. Hehe, 그건 잘되지 않았다.

귀하의 개체를 다르게 등록해야 할 것이라고 말하고 싶습니다. 범위가 필요한 항목의 범위는 실제로 범위가 필요하며 그 외 모든 항목은 transients 또는 singletons입니다. 나는 보통 다음 패턴을 따른다 :

코드 모두 singleton 및 코드 thread-safe.
스레드로부터 안전하지 않으면 transient으로 만들고 등록하십시오. Scoped는 그래서 그들은 요청의 삶에 대한 개체의 변경 사항을 추적 할 수

ORMunit-of-work 패턴을 사용하지 않는 경우에, 나는 일반적으로 내 ORM 용기를 등록되며, SaveChanges를(), 후자 (예 : 엔티티 프레임 워크 4, NHibernate의 세션 등).

+1

고마워요. 내가 잘못 생각한 것 같았 어. 나는 더 많은 독서/할 계획이 있다고 생각한다. – cschear