从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; }
    }
}

从HomeController调用存储库接口null错误

我猜在这个例子中,他们在构造函数中传递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。从后者开始:稍微调整一下HomeControllerMyEntitiesRepository类:

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

在此工作之前,您需要注册MyEntitiesIMyEntities的映射:

container.RegisterType<IMyEntities, MyEntities>();

如果你选择尝试Unity,我建议你尝试一下,如果你卡住了,问一个新的问题。