2017-02-17 9 views
2

언급이있는 아래 코드를 사용하여 데이터베이스에서 데이터를 가져 오려고하면 DbContext has been disposed error이 표시됩니다.
DbContext가 삭제되었으므로 작업을 완료 할 수 없습니다. nopcommerce

이 문제를 해결하는 방법은 무엇입니까?

public class ExampleService<T> where T : Example 
{ 
    protected readonly IRepository<T> _exampleRepository; 

    public ExampleService() 
    { 
    _exampleRepository= EngineContext.Current.Resolve<IRepository<T>>(); 
    } 

    public IList<T> GetService() 
    { 
    var query = _exampleRepository.Table; 
    return query.ToList(); 
    } 
} 
+0

ExampleService 클래스가 코드에 의해 제대로 삽입되고 생성되지 않으면 그 문제가 발생한 이유를 볼 수 없습니다. Autofac은 그런 일을 방지하기 위해 enties lifecicle을 관리합니다. 그래서 샘플에 누락 된 코드가 있다고 가정합니다. ExampleService를 인스턴스화하는 방법을 검토하면됩니다. 어쨌든이 주석의 주된 이유는 리소스 로케이터를 사용하는 대신 생성자에서 종속성을 주입하는 것을 기억하는 것입니다. ResourceLocator는 가능한 경우 피할 수있을 정도로 나쁜 패턴입니다. 분명히,이 경우에는 그럴 이유가 없습니다. –

답변

1

문제는 아직 사용중인 개체의 일부를 처리해야합니다.

항상이 방법으로 서비스를 해결하기 위해 시도 :

protected readonly IRepository<T> _exampleRepository; 

희망이 도움이

var _exampleRepository = EngineContext.Current.Resolve<IRepository<T>>(); 

에!

1

샘플에 코드가 충분하지 않다고 생각합니다. 종속성 범위에서 ExampleService를 얻는다면 완벽하게 작동해야합니다.

그래서 내 대답은 : ResourceLocator를 사용하는 대신 생성자에서 종속성 주입을 사용하십시오. 대신 생성자에서 의존성을 선언하고 여전히 문제가있는 경우 (예 : IRepository의 인스턴스를받지 못하는 경우), autofac 범위 외부에서 ExampleService를 잘못된 방법으로 인스턴스화하는 것이 확실 할 수 있습니다. 문제 때문에.