我一直在閱讀關於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);
}
是的。該方法從數據庫表中檢索細節。添加了上面的代碼。所以這就是問題,呃?我需要以某種方式使用Unity來生成所有具有依賴關係的對象......? – Hanshan 2010-11-10 04:34:06
是的,要麼產生它們,要麼在它們產生後填充它們的依賴關係。但是,如果從存儲庫中出來的對象具有依賴關係,這是一種代碼異味,它告訴我你沒有將問題分離得很好。爲什麼每個聯繫人都需要有一個存儲庫?這個功能不應該放在另一個班上嗎?如果您更新自己的問題並提供更多有關您要完成的內容的詳細信息,我會更新我的回答,並提供一些關於如何更好地組織代碼以避免此問題的建議。 – StriplingWarrior 2010-11-10 16:54:36
非常感謝,夥伴。它只是存儲庫上的一個驗證方法,用於檢查是否已經存在具有相同名稱,電子郵件地址等的Contact對象,以防止重複。因此,在NerdDinner教程之後,我在運行「GetRuleViolations()」方法的類上公開了一個「IsValid」布爾 - 我從那裏調用回購。我玩弄了一個單獨的「Validator」類來傳遞Contact對象,但它似乎過分複雜。不過,我仍然樂於接受替代品。可能很明顯,我相對缺乏經驗,非常樂於提供建議和建議!乾杯。 – Hanshan 2010-11-10 22:25:44