Asp.net mvc 具有IRepository模式的POCO类的构造函数和方法

Asp.net mvc 具有IRepository模式的POCO类的构造函数和方法,asp.net-mvc,poco,irepository,Asp.net Mvc,Poco,Irepository,在POCO类上使用构造函数或其他非数据库访问方法可以吗。例如,将视图模型传递给控制器时 控制器: 实体: 第一个实体构造函数用于实体框架或常规创建 var entity = new entity { // set up properties }; 第二个是从SomeViewModel创建 var entity = new entity(SomeViewModel); var entity = SomeIRepository.Get(id); entity.Update(SomeVi

在POCO类上使用构造函数或其他非数据库访问方法可以吗。例如,将视图模型传递给控制器时

控制器:

实体:

第一个实体构造函数用于实体框架或常规创建

var entity = new entity 
{
    // set up properties
};
第二个是从SomeViewModel创建

var entity = new entity(SomeViewModel);
var entity = SomeIRepository.Get(id);
entity.Update(SomeViewModel);
该方法用于从SomeViewModel更新自身

var entity = new entity(SomeViewModel);
var entity = SomeIRepository.Get(id);
entity.Update(SomeViewModel);

或者是上述坏习惯,应该去其他地方。

是和否。一般来说,在POCO上有一个构造函数并不一定是坏习惯。你想要或需要它的原因有很多。但是,您还需要确保维护一个无参数构造函数,否则会导致EF之类的问题,否则就不知道如何正确初始化POCO类

也就是说,你在这里做的不是好的实践。您还没有提供大量代码,但您所做的似乎是将视图模型传递给POCO构造函数,以使用这些值设置POCO上的属性。相反,您应该做的是从数据库中提取新实体,然后将视图模型上的任何相关属性映射到该实体实例。我认为您在创建一个新实体时所做的一切都可以,但这意味着有两种不同的方法用值填充您的POCO类,具体取决于您是在创建还是编辑。这增加了复杂性,复杂性意味着更高的维护成本

相反,您应该使用AutoMapper之类的库或创建实用程序类来处理映射:

public static class SomePocoMapper
{
    public static SomePoco Map(SomeViewModel model)
    {
        return Map(model, null);
    }

    public static SomePoco Map(SomeViewModel model, SomePoco entity)
    {
        entity = entity ?? new SomePoco();
        // map over property values;
        return entity;
    }
}
然后在创建操作中:

var entity = SomePocoMapper.Map(model);
在编辑操作中:

var entity = // get entity from database
SomePocoMapper.Map(model, entity);

我只是在创建或编辑要存储到数据库的类时才这样做。我想这仍然是一个坏习惯。我也使用空构造函数。我不是一个大风扇或自动映射器,所以我应该在ViewModel上有一个返回新POCO实体的方法。或者,如果一个单独的服务再次执行此操作,则不希望返回新的实体,除非您首先要创建实体。当涉及到编辑时,您应该对从数据库中提取的实例进行修改。如果你想避免使用AutoMapper,那么就使用类似于我发布的静态映射类的东西。我想说的是。构造函数将创建新实体。还有一个名为update的方法,它根据视图模型中的值更新实体。这一切都与一个背景有关。更新只是对上下文进行更改。这是我的错,我没有添加更多的代码,但我添加了上面的更新方法。我希望我的解释是对的,这还是不合适的。实体不应该了解视图模型,反之亦然。事实上,一个典型的应用程序可能有多个视图模型,它们代表一个实体用于不同的目的,因此您必须开始添加额外的更新方法和/或重载。简单地说,您的视图正在流入您的域,这很糟糕。谢谢,这很有意义。