, 내가와 같은 MVC 애플리케이션 내 리포지토리 개체를 인스턴스화하고 있습니다 :MVC 간단한 인젝터 및 단순 인젝터 문서 당으로 RegisterPerWebRequest
container.RegisterPerWebRequest<IUserRepository, SqlUserRepository>();
container.RegisterPerWebRequest<IOrderRepository, SqlOrderRepository>();
하지만 난 그냥 발견 한 문서도 상태 :
Simple Injector의 기본 동작과 달리 이러한 확장 메서드는 만들어진 인스턴스가 IDisposable을 구현할 때 이 처리되도록합니다.
https://simpleinjector.codeplex.com/wikipage?title=ObjectLifestyleManagement#PerWebRequest
질문 : RegisterPerWebRequest를 사용하는 경우이 그들이 웹 요청의 마지막에 배치받을 수 있도록 내 개체는 IDisposable을 구현해야, 뜻 (즉, 코드 아래)?
사이드 노트 : WebRequestLifestyle, RegisterInitializer, RegisterForDisposal을 사용하면 IDisposable을 구현하는 객체가 필요하다고 생각합니다.
아래의 예제 코드 (인터페이스 및 구현).
public interface IUserRepository : IDisposable
{
...
}
public class SqlUserRepository : IUserRepository, IDisposable
{
...
...
...
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
_context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
일반적으로 인터페이스에는 IDisposable이 구현되어서는 안됩니다. 귀하의 [구현은]해야합니다 (https://stackoverflow.com/questions/12259534/is-it-a-leaky-abstraction-if-implementation-of-interface-calls-dispose). 그렇지 않으면 구현 세부 사항이 누출되어 [의존성 반전 원리] (https://en.wikipedia.org/wiki/Dependency_inversion_principle)를 위반합니다. – Steven
이 재 유출 알지 못했습니다. 나는 지금 본다. 감사. –