我已经在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);
}
答案 0 :(得分:1)
GetContact(int)
方法在您的存储库实现中是什么样的?是否使用Unity来生成联系人?我怀疑它没有。
答案 1 :(得分:0)
您可以使用DependencyResolver解决它,如果那是你正在使用的解析器。
repo = DependencyResolver.Current.GetService<IRepository>();
答案 2 :(得分:0)
我建议你在所有这些代码旁边编写一些单元测试,以不断测试和验证你编写的代码。除了StriplingWarrior的建议,我还建议你检查你的DI Container电线。