MVC 3 передает объект в качестве интерфейса - PullRequest
5 голосов
/ 21 ноября 2011

В настоящее время я работаю над проектом MVC 3, используя Ninject в качестве моего DI, бизнес-объекты хранятся в отдельной сборке. Я сталкиваюсь с проблемой с параметрами контроллера, при повторной публикации для операций CRUD я получаю сообщение об ошибке «Не удается создать экземпляр интерфейса». Я знаю, что вы не можете создать экземпляр интерфейса, но, похоже, единственный способ, которым я могу обойти это, - это использовать привязку пользовательской модели и пропустить FormCollection. Это кажется очень запутанным, и я хочу сохранить как можно больше кода, специфичного для типов, из проекта - следовательно, везде есть интерфейсы и Ninject для DI - бетонов. Мало того, что привязка пользовательских моделей кажется грязной - не потеряю ли я свои аннотации данных?

Код для описания того, что у меня есть:

public ActionResult Create()
{
    // I'm thinking of using a factory pattern for this part
    var objectToCreate = new ConcereteType();
    return (objectToEdit);
}

[HttpPost]
public ActionResult Create(IRecord record)
{
    // check model and pass to repository
    if (ModelState.IsValue)
    {
        _repository.Create(record);
        return View();
    }

    return View(record);
}

Кто-нибудь сталкивался с этим раньше? Как ты справился с этим?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 21 ноября 2011

но, похоже, единственный способ обойти это - использовать связующее для пользовательской модели

Правильное направление - это специальная модель. Кстати, вы должны использовать модели представлений в качестве аргументов действий, а не доменные модели или интерфейсы.

Мало того, что привязка пользовательской модели кажется грязной - не потеряю ли я свои аннотации данных?

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

3 голосов
/ 21 ноября 2011

Данные, передаваемые в действие контроллеров, являются просто держателями значений. В них не должно быть никакой логики, так что нечего отделять. Вы можете использовать конкретные типы (например, Запись) вместо интерфейса (IRecord)

2 голосов
/ 17 октября 2013

Я совершил такую ​​же простую ошибку.Ninject вводит параметры в ваш конструктор, но вы добавили параметры в действие Index Controller.

Это должно выглядеть так:

public class HomeController : Controller
{
    private IRecord _record;

    public HomeController(IRecord record)
    {
        _record = record;
    }

    public ActionResult Index()
    {
        ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application. " +
                          _record .HelloWorld();

        return View();
    }
}

Имеет смысл?

...