具有存储库模式的 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);
在 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);