Нулевая ошибка интерфейса репозитория при вызове из HomeController - PullRequest
0 голосов
/ 27 сентября 2011

Я следовал этому уроку: http://blog.johanneshoppe.de/2010/10/walkthrough-ado-net-unit-testable-repository-generator/

И у меня была эта проблема: MVC3 & EF.Интерфейс для 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;

       }

` EDIT:
контекст взят из:

    [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 ]

3 голосов
/ 27 сентября 2011

Я предполагаю, что в примере они передают Context в конструкторе.Они могут сделать это, потому что они используют внедрение зависимости, и это создаст этот экземпляр для вас.Поскольку вы не используете Ninject, вам, скорее всего, придется создавать этот контекст самостоятельно.

Если вы не можете использовать Ninject или какой-либо другой контейнер IoC, вам нужно лучше убедить своих боссов позволитьвы.Если они все еще не позволяют вам, вы можете сделать инъекцию зависимости бедного человека, я полагаю:

public class MyEntitiesRepository
{
    private MyDbContext context;

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

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

Это лучше, чем ничего, я полагаю?

1 голос
/ 27 сентября 2011

Просмотр редактирования (атрибут Dependency) Я предполагаю, что ограничения проекта, о которых вы говорите, заключаются в том, что вместо Ninject вы должны использовать Microsoft 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, но я заметил, что вам нужно создать MyEntityRepository с использованием UnityContainer объекта:

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

Прежде чем это сработает, вам нужно зарегистрировать отображениеMyEntities до IMyEntities:

container.RegisterType<IMyEntities, MyEntities>();

Если вы решите попробовать Unity, я предлагаю вам попробовать и задать новый вопрос, если вы застряли.

...