ASP.NET MVC Ninject / DI - для этого объекта не определен конструктор без параметров - PullRequest
1 голос
/ 17 сентября 2011

Я использую попытку заставить меня выполнить круговые юнит-тесты с помощью DI / Mocks (Ninject / Moq), чтобы внедрить репозиторий Product в мой контроллер, который я затем передаю своей модели представления, чтобы разрешить это тестирование.

Он отлично работает и позволяет мне протестировать действие контроллера и модель представления. Однако, когда я запускаю приложение, я получаю сообщение «Для этого объекта не определен конструктор без параметров» ... теперь я знаю, что это происходит из-за того, что контроллер пытается инициализировать модель представления, у которой нет конструктора без параметров.

Я мог бы создать конструктор и вызвать из него мой конкретный репозиторий (поэтому модульные тесты все еще используют инжектированный / проверенный).

Это правильный подход? Любой совет будет принята с благодарностью!

Контроллер:

* * 1010

Просмотр модели:

public class ProductsIndex
{
    public List<CTEntities.Product> ProductList { get; set; }

    public ProductsIndex(IProductRepository prods)
    {
        ProductList = prods.List().ToList();
    }

    //Adding this constructor would fix my issue but is there a cleaner way?
    public ProductsIndex()
    {
        var prod = new CTDAL.Product();
        ProductList = prod.List().ToList();
    }
}

Ответы [ 2 ]

2 голосов
/ 17 сентября 2011

Ваша модель представления должна быть DTO (объект передачи данных) ... в том смысле, что она должна содержать только свойства и НЕ должна отвечать за получение данных. Ваш контроллер должен получить данные для модели представления, например:

Новая модель:

public class ProductsIndex
{
    public List<CTEntities.Product> ProductList { get; set; }
}

Новый контроллер:

public class ProductsController : Controller
{
    private readonly IProductRepository productRepository;

    public ProductsController(IProductRepository productRepository)
    {
        this.productRepository = productRepository;
    }

    //
    // GET: /Products/
    public ActionResult Index()
    {
        var products = productRepository.List().ToList();
        return View(products);
    }

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

Один из подходов - позволить Ninject разрешить ваши ProductsIndex экземпляры. Если вы сделаете это, он будет автоматически заполнять аргументы конструктора, как требуется, при условии, что IProductRepository также разрешается с помощью Ninject.

В вашем случае может быть что-то вроде:

Kernel.Bind<IProductRepository>().To<CTDAL.Product>();
Kernel.Bind<ProductsIndex>().ToSelf();

Теперь ваш ProductsController может выглядеть так:

public class ProductsController : Controller
{
    private readonly IProductRepository productRepository;
    private readonly ProductsIndex productsIndex;
    public ProductsController(IProductRepository productRepository, 
                              ProductsIndex productsIndex)
    {
        this.productRepository = productRepository;
        this.productsIndex = productsIndex;
    }

    //
    // GET: /Products/
    public ActionResult Index()
    {
        return View(productsIndex);
    }
}

Имейте в виду, что это не позволит сопоставить значения запроса с вашей Viewmodel, поэтому данные в вашей Viewmodel будут зависеть только от параметров, которые вы передаете в него во время его разрешения (в данном случае продукт хранилище).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...