2011-02-24 34 views
0

雖然我非常新,但爲了學習nhibernate和DI與結構圖,所以我正在製作一個應用程序來測試所有東西。將我的UnitOfWork注入到我的Repository構造器中

我有一些問題注入我的基礎知識庫到我的基礎知識庫。我爲每個請求創建一個單元工作,然後在最後提交或回滾。但是,當我嘗試在我的方法中使用它時試圖將其注入到我的基本存儲庫中時,它始終爲空。更具體地說,我得到這個錯誤:「對象引用未設置爲對象的實例」。任何想法即時做錯了,如果這是我應該去的正確路線?

非常感謝提前。

基礎信息庫:

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發生的basepage。我訪問存儲庫這樣的:

public IArticleRepository ArticleRepo { get; set; } 

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

調用此方法上的Application_Start:

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

,並在webregistry:

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

你如何實例化你的倉庫? – mxmissile 2011-02-24 22:48:09

+0

@geepie多數民衆贊成你如何註冊它,你如何「獲得」的.aspx頁面IArticleRepository的一個實例? – mxmissile 2011-02-24 23:28:03

+0

我會假設他只是在做var repository = ObjectFactory.GetInstance (); – Phill 2011-02-24 23:50:00

回答

3

有一個很好的機會你ArticleRepository沒有一個構造函數的IUnitOfWork作爲一個參數確定您有以下幾點

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

記住Strcuture map在它實例化的類上使用最貪婪的構造函數。由於您的抽象存儲庫類永遠不會被實例化,因此不會使用它的構造函數。如果您的類需要以這種方式注入它們的依賴項,我還會建議不要使用任何默認構造函數。這種方式出錯的機會較少。

1
public readonly IUnitOfWork _unitOfWork; 

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

我想你的意思寫

public readonly IUnitOfWork _unitOfWork; 

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

您將局部變量分配給參數,而不是將參數分配給局部變量。

編輯:你也應該寫一個小寫U「的UnitOfWork」,而不是你的參數「的UnitOfWork」

+0

嗨Phill,把他們轉了一圈,我仍然有同樣的問題。 – gdp 2011-02-25 00:04:58

+0

您是否在構造函數中放置了一個斷點以查看UoW是否被傳入? – Phill 2011-02-25 00:08:52

+0

嗨Phill,是的,我試過了,斷點沒有捕獲任何東西,調試器直接進入保存方法中的_unitOfWork。 – gdp 2011-02-25 00:41:18

相關問題