我一直在阅读关于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