2010-11-10 80 views
0

我一直在閱讀關於MVC中的Unity幾天,我一直試圖讓這個工作 - 希望你們可以幫忙。MVC Unity DI設置器方法問題

我已經按照here的方式設置了Unity,它從廣泛的谷歌搜索中看起來很普遍。我大概可以證實,這個設置是工作,因爲我的家庭控制器我能得到這個DI很好地工作:

public class HomeController : Controller 
{ 
    [Dependency] 
    public IRepository repo { get; set; } 

    public ActionResult Index() 
    { 
     string message = repo.GetMessage(); 

     ViewData["OUT"] = message; 

     return View(); 
    } 
} 

不過,我有一個類(「聯繫方式」),因種種原因,還需要訪問庫方法,因此耦合,以及對DI的要求。所以在課堂上,我有一個[Dependency]屬性,就像上面那樣。因此,例如我有以下代碼:

public partial class Contact 
{ 
    [Dependency] 
    public IRepository repo { get; set; } 

    public string CoupledProperty 
    { 
     get 
     { 
      return repo.GetCoupledProperty(); 
     } 
    } 

所以,那麼,如果我試圖找回在家庭控制器已經存在的聯繫對象,如:

public class HomeController : Controller 
{ 
    [Dependency] 
    public IRepository repo { get; set; } 

    public ActionResult Index() 
    { 
     Contact contact = repo.GetContact(1); 
     string message = contact.CoupledProperty; 

     ViewData["OUT"] = message; 

     return View(); 
    } 
} 

我得到一個不實例化對象錯誤高亮CoupledProperty嘗試訪問存儲庫的Contact類中的代碼行。當然,替換硬編碼存儲庫對象的Contact類中的Dependency屬性也能正常工作。

任何人都可以看到這裏出了什麼問題嗎?

乾杯,

Tim。

編輯:

資源庫中的GetContact(int)方法是:

public Contact GetContact(int id) 
{ 
    return db.Contacts.SingleOrDefault(c => c.ContactID == id); 
} 

回答

1

什麼是GetContact(int)方法看起來像你的倉庫實現?它使用Unity來產生聯繫嗎?我懷疑它沒有。

+0

是的。該方法從數據庫表中檢索細節。添加了上面的代碼。所以這就是問題,呃?我需要以某種方式使用Unity來生成所有具有依賴關係的對象......? – Hanshan 2010-11-10 04:34:06

+0

是的,要麼產生它們,要麼在它們產生後填充它們的依賴關係。但是,如果從存儲庫中出來的對象具有依賴關係,這是一種代碼異味,它告訴我你沒有將問題分離得很好。爲什麼每個聯繫人都需要有一個存儲庫?這個功能不應該放在另一個班上嗎?如果您更新自己的問題並提供更多有關您要完成的內容的詳細信息,我會更新我的回答,並提供一些關於如何更好地組織代碼以避免此問題的建議。 – StriplingWarrior 2010-11-10 16:54:36

+0

非常感謝,夥伴。它只是存儲庫上的一個驗證方法,用於檢查是否已經存在具有相同名稱,電子郵件地址等的Contact對象,以防止重複。因此,在NerdDinner教程之後,我在運行「GetRuleViolations()」方法的類上公開了一個「IsValid」布爾 - 我從那裏調用回購。我玩弄了一個單獨的「Validator」類來傳遞Contact對象,但它似乎過分複雜。不過,我仍然樂於接受替代品。可能很明顯,我相對缺乏經驗,非常樂於提供建議和建議!乾杯。 – Hanshan 2010-11-10 22:25:44

0

你可以使用DependencyResolver解決它,如果這是你正在使用的解析器。

repo = DependencyResolver.Current.GetService<IRepository>(); 
0

我建議你寫一些單元測試以及所有這些代碼,以不斷測試和驗證你寫的代碼。除了StriplingWarrior的建議之外,我還建議您檢查一下您的DI容器接線。