具有存储库模式的 POCO 类 上的构造函数和方法

Constructors and Methods on POCO classes with the IRepository Pattern

在 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
}

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

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

第二个用于从 SomeViewModel 创建

var entity = new entity(SomeViewModel);

该方法用于从 SomeViewModel 更新自身

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

或者上面的坏习惯应该去其他地方。

是也不是。通常,在 POCO 上使用构造函数不一定是不好的做法。您可能想要或需要它的原因有很多。但是,您还需要确保维护一个无参数构造函数,否则您将导致 EF 之类的问题,否则它们将不知道如何正确初始化您的 POCO class。

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

相反,您应该使用像 AutoMapper 这样的库或创建一个实用程序 class 来处理映射:

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