2010-11-10 66 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容器接线。