-1

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

控制器:

public ActionResult SomeMethod(SomeViewModel model) 
{
    var entity = new SomePocoClasse(model);
    // ... then save entity to database

    return SomeActionResult
}

实体:

public SomeClass() {}

public SomeClass(SomeViewModel model) 
{
    // create itself based on values in model
}

public void Update(SomeViewModel model)
{
    // Update itself base on values in model
}

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

var entity = new entity 
{
    // set up properties
};

第二个是从 SomeViewModel 创建

var entity = new entity(SomeViewModel);

该方法用于从 SomeViewModel 更新自身

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

还是上述不良做法应该去其他地方。

4

1 回答 1

2

是和不是。一般来说,在 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);
于 2016-12-02T16:30:05.533 回答