MVC Unity DI Setter方法问题

时间:2010-11-10 04:01:25

标签: asp.net-mvc unity-container

我已经在MVC中阅读了几天关于Unity的内容,我一直在努力让它发挥作用 - 希望你们能帮忙。

我按照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();
    }
}

但是,我有一个类(“Contact”),由于各种原因,它还需要访问存储库方法,因此需要访问耦合和DI的要求。所以在课堂上我有一个[Dependency]属性,如上所述。例如,我有以下代码:

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

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

那么,如果我尝试在Home Controller上检索已经存在的Contact对象,例如:

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();
    }
}

我得到一个未实例化的对象错误,突出显示Contact类上的代码行,其中CoupledProperty尝试访问存储库。当然,在Contact类中交换Dependency属性可以正常运行。

有谁能看到这里出了什么问题?

干杯,

编辑:

存储库中的GetContact(int)方法是:

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

3 个答案:

答案 0 :(得分:1)

GetContact(int)方法在您的存储库实现中是什么样的?是否使用Unity来生成联系人?我怀疑它没有。

答案 1 :(得分:0)

您可以使用DependencyResolver解决它,如果那是你正在使用的解析器。

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

答案 2 :(得分:0)

我建议你在所有这些代码旁边编写一些单元测试,以不断测试和验证你编写的代码。除了StriplingWarrior的建议,我还建议你检查你的DI Container电线。