MVC 3传递实体作为接口

Pau*_*ann 5 dependency-injection interface model-binding loose-coupling asp.net-mvc-3

我目前正在使用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);
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Dar*_*rov 6

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

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

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

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


Nov*_*kov 3

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