具有IRepository模式的POCO类的构造函数和方法

时间:2016-12-02 16:05:28

标签: asp.net-mvc poco irepository

是否可以在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);

或者上述不良做法应该去其他地方。

1 个答案:

答案 0 :(得分: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);