5

我目前正在使用 Ninject 作为我的 DI 的 MVC 3 项目,业务对象存储在单独的程序集中。我遇到了控制器参数的问题,在发回 CRUD 操作时,我收到错误“无法创建接口的实例”。我知道您无法创建接口的实例,但似乎我可以解决此问题的唯一方法是使用自定义模型绑定器并通过 FormCollection。这看起来真的很乱,我想尽可能多地保留项目中的特定类型代码 - 因此到处都是接口,并且 Ninject 到 DI 混凝土。不仅自定义模型绑定看起来很乱——我不会丢失我的 DataAnnotations 吗?

一些代码来描述我所拥有的:

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

有没有人遇到过这个?你是怎么克服的?

谢谢!

4

3 回答 3

6

但似乎我可以解决这个问题的唯一方法是使用自定义模型绑定器

自定义模型绑定器是正确的方法。顺便说一句,您应该使用视图模型作为操作参数,而不是域模型或接口。

不仅自定义模型绑定看起来很乱——我不会丢失我的 DataAnnotations 吗?

我不知道您为什么认为自定义模型绑定器会使事情变得混乱。对我来说,这是将映射逻辑分离为可重用类的好方法。而且,不,您不会丢失 DataAnnotations。它们将在自定义模型绑定器将返回的具体实例上完美地工作。

于 2011-11-21T16:51:57.850 回答
3

传递给控制器​​动作的数据只是值的持有者。他们不应该有任何逻辑,所以没有什么可以解耦的。您可以使用具体类型(例如 Record)而不是接口(IRecord)

于 2011-11-21T16:50:58.190 回答
2

我犯了同样简单的错误。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();
    }
}

有道理?

于 2013-10-16T21:20:36.923 回答