2011-02-24 4 views
0

임 새 기능이지만 구조 맵을 사용하여 nhibernate와 DI를 배우는 퀘스트에서 모든 것을 테스트하는 앱을 만들고 있습니다.내 UnitOfWork를 리포지토리 생성자에 삽입

내 기본 저장소에 단위 작업을 주입하는 데 문제가 있습니다. 모든 요청에 ​​대해 단위 작업을 작성한 다음 끝에 커밋하거나 롤백합니다. 하지만 내 기본 저장소에 주입하려고 할 때 항상 내 메서드에서 사용하려고 할 때 null입니다. 더 구체적으로 내가이 오류 : "개체 참조가 개체의 인스턴스로 설정되지 않습니다". 어떤 아이디어가 잘못하고 무엇이 올바른 경로라면 나 가야합니까?

미리 감사드립니다.

자료 저장소 :

public abstract class Repository<T> : IRepository<T> 
{ 
    public readonly IUnitOfWork _unitOfWork; 

    public Repository(IUnitOfWork UnitOfWork) 
    { 
    UnitOfWork = _unitOfWork; 
    } 

    public Repository() {} 

    public void Save(T obj) 
    { 
    _unitOfWork.CurrentSession.Save(obj); 
    } 
} 

StructureMap 레지스트리가 내 위해 Application_Start 설정 이잖아 :

public class NHibernateRegistry : Registry 
{ 
    public NHibernateRegistry() 
    { 
    For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>(); 

    For<ISession>().HybridHttpOrThreadLocalScoped().Use(context => context.GetInstance<ISessionFactory>().OpenSession()); 

    For<ISessionFactory>().Singleton().Use(NHibernateSessionFactory.GetSessionFactory()); 
    } 
} 

업데이트 :

baserepository 특정 repositorys 상속 즉 ArticleRepository 다음에 그 주입 메신저 내 application_start에 aspx 페이지. 그런 다음 내 aspx 페이지는 buildUp이 수행되는 기본 페이지를 상속받습니다. 그리고 나는이 같은 저장소에 액세스 :

public class Bootstrapper 
    { 
    public static void BootStrap() 
    { 
     ObjectFactory.Configure(x => 
     { 
     x.AddRegistry<NHibernateRegistry>(); 
     x.AddRegistry<WebRegistry>(); 
     }); 
    } 
    } 

을 그리고 webregistry에 :

For<IArticleRepository>().Use<ArticleRepository>(); 
+1

어떻게 저장소를 인스턴스화합니까? – mxmissile

+0

@geepie thats 등록 방법, .aspx 페이지에서 IArticleRepository의 인스턴스를 "얻는"방법은 무엇입니까? – mxmissile

+0

나는 그가 단지 var repository = ObjectFactory.GetInstance ();를 수행하고 있다고 가정합니다. – Phill

답변

3

좋은 기회가 당신의 ArticleRepository 확인 매개 변수로 IUnitOfWork를 사용하는 생성자가 없습니다 당신은 다음을 가지고 있습니다

public class ArticleRepository : Repository<Article> 
{ 
    public ArticleRepository(IUnitOfWork unitOfWork) : base(unitOfWork) 
    { 
    } 
... 
} 

기억하십시오 Strcuture지도는 인스턴스 생성하는 클래스에서 greediest 생성자를 사용합니다. 추상 저장소 클래스는 결코 인스턴스화되지 않으므로 생성자를 사용하지 않습니다. 클래스에 의존성을 주입해야하는 경우 기본 생성자가없는 것이 좋습니다. 오류 가능성이 적습니다.

1
public readonly IUnitOfWork _unitOfWork; 

    public Repository(IUnitOfWork UnitOfWork) 
    { 
    UnitOfWork = _unitOfWork; 
    } 

난 당신이

를 작성하는 의미 생각

public IArticleRepository ArticleRepo { get; set; } 

public void SaveThing() 
{ 
    ArticleRepo.Save(object); 
} 

이를 위해 Application_Start에 호출되는

public readonly IUnitOfWork _unitOfWork; 

    public Repository(IUnitOfWork UnitOfWork) 
    { 
    _unitOfWork = UnitOfWork; 
    }

로컬 변수에 대한 매개 변수 대신 매개 변수에 로컬 변수를 할당했습니다.

편집 : 또한 당신은 소문자 U '의 UnitOfWork'대신 사용하여 매개 변수를 작성해야 '의 UnitOfWork'

+0

안녕하세요, Phill, 라운드를 전환하고 난 여전히 같은 문제가 있습니다. – gdp

+0

UoW가 전달되고 있는지 확인하기 위해 생성자에 중단 점을 넣었습니까? – Phill

+0

Hi Phill, yeh 나는 그걸 시험해 보았고 breakpoint doesnt는 디버거가 save 메소드의 _unitOfWork로 곧바로 간다. – gdp