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

时间:2011-09-27 13:14:49

标签: c# asp.net-mvc entity-framework-4 interface repository

我正在关注本教程: http://blog.johanneshoppe.de/2010/10/walkthrough-ado-net-unit-testable-repository-generator/

我有这个问题: MVC3 & EF. Interface for TDD

但是,现在我设置了界面(由于项目限制,我没有使用ninject)

我在这里得到一个空错误;

`Public partial class MyEntitiesRepository : MyEntitiesRepository
    {
        public IEnumerable<userdetails> getAlluserDetails()
        {
            return this.Context.userDetails.ToList();

        }`

上下文为空。我使用与教程完全相同的结构。

调用它的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; }
    }
}

2 个答案:

答案 0 :(得分:3)

我猜测在示例中他们在构造函数中传递了Context。他们可以这样做,因为他们正在使用依赖注入,它将为您创建该实例。由于您没有使用Ninject,因此您很可能需要自己构建此Context。

如果您无法使用Ninject或任何其他IoC容器,那么您需要做得更好,说服您的老板让您。如果他们仍然不让你那么你可以做穷人的依赖注射我想:

public class MyEntitiesRepository
{
    private MyDbContext context;

    public MyEntitiesRepository() : this(new MyDbContext())
    { }

    public MyEntitiesRepository(MyDbContext context)
    {
        this.context = context;
    }
}

这比我想的更好吗?

答案 1 :(得分:1)

看到编辑(Dependency属性)我猜你所指的项目限制是使用Microsoft's Unity代替Ninject。

现在您可以使用或不使用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没有任何经验,但我注意到的一些事情是您需要使用MyEntityRepository对象创建UnityContainer

IUnityContainer container = new UnityContainer();
...
MyEntityRepository repository = container.Resolve<MyEntityRepository>();

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

container.RegisterType<IMyEntities, MyEntities>();

如果您选择尝试Unity,我建议您尝试一下,如果您遇到问题,可以提出一个新问题。