从HomeController调用存储库接口null错误
本文关键字:接口 null 错误 存储 HomeController 调用 | 更新日期: 2023-09-27 18:09:55
我遵循这个教程:http://blog.johanneshoppe.de/2010/10/walkthrough-ado-net-unit-testable-repository-generator/
我有这个问题:MVC3,EF。TDD接口
然而,现在我已经设置了接口(由于项目限制,我没有使用ninject)
我在这里得到一个null错误;
`Public partial class MyEntitiesRepository : MyEntitiesRepository
{
public IEnumerable<userdetails> getAlluserDetails()
{
return this.Context.userDetails.ToList();
}`
Context为空。我使用与教程完全相同的结构。
在我的MVC控制器的头调用这个是:'
[HandleError]
public class HomeController : Controller
{
private MyEntitiesRepository _repository;
...
...
public HomeController() : this(new externalEntities(), new MyEntitiesRepository ()){}
public HomeController(externalEntities external, MyEntitiesRepository repository)
{
_repository = repository;
_ContextExt = external;
}
'编辑:
上下文来自:
[System.CodeDom.Compiler.GeneratedCode("ADO.NET Unit Testable Repository Generator", "0.5")]
public partial class MyEntitiesRepository
{
/// <summary>
/// Gets or sets the specialised object context
/// </summary>
/// <value>object context</value>
#if !DO_NOT_USE_UNITY
[Dependency]
#endif
public IMyEntities Context { get; set; }
}
}
我猜在这个例子中,他们在构造函数中传递Context。他们可以这样做,因为他们正在使用依赖注入,它会为你创建那个实例。因为你没有使用Ninject,你很可能需要自己构造这个Context。
如果你不能使用Ninject或任何其他IoC容器,那么你需要做一个更好的工作来说服你的老板让你这么做。如果他们仍然不允许,那么你可以做穷人的依赖注入:
public class MyEntitiesRepository
{
private MyDbContext context;
public MyEntitiesRepository() : this(new MyDbContext())
{ }
public MyEntitiesRepository(MyDbContext context)
{
this.context = context;
}
}
我想这总比没有好吧? 看到编辑(Dependency
属性),我猜你所指的项目限制是,而不是Ninject,你要使用微软的Unity。
现在你可以解决你的问题使用或不使用Unity。从后者开始:稍微调整一下HomeController
和MyEntitiesRepository
类:
public HomeController() :
this(new externalEntities(),
new MyEntitiesRepository (new MyEntities()))
{
}
public HomeController(externalEntities external, MyEntitiesRepository repository)
{
_repository = repository;
_ContextExt = external;
}
public partial class MyEntitiesRepository
{
public MyEntitiesRepository(IMyEntities context)
{
this.Context = context;
}
public IMyEntities Context { get; private set; }
}
这里我假设你有一个类MyEntities
实现接口IMyEntities
。
你也可以使用Unity。为了更好地了解这个框架,你可以从MSDN开始。我没有Unity的任何经验,但我注意到的一些事情是,你需要使用UnityContainer
对象创建MyEntityRepository
:
IUnityContainer container = new UnityContainer();
...
MyEntityRepository repository = container.Resolve<MyEntityRepository>();
在此工作之前,您需要注册MyEntities
到IMyEntities
的映射:
container.RegisterType<IMyEntities, MyEntities>();
如果你选择尝试Unity,我建议你尝试一下,如果你卡住了,问一个新的问题。