我们正在开发具有以下层的应用程序:
我们正在寻找一种方法来将物理数据层的实体共享给DL和BL。
这些要点在决定最佳架构时非常重要:
我遇到过共享所有层实体(+快速实现, - 可扩展性)或每层实体(DTO)架构(+可扩展性, - 快速实现/可重用性)的架构。 This blogpost描述了这两种架构。
是否有一种方法可以结合这些架构并将我们的要求考虑在内?
目前我们已经提出了以下类和接口:
接口:
// Contains properties shared for all entities
public interface I_DL
{
bool Active { get; set; }
}
// Contains properties specific for a customer
public interface I_DL_Customer : I_DL
{
string Name { get; set; }
}
PDL
// Generated by EF or mocking object
public partial class Customer
{
public bool Active { get; set; }
public string Name { get; set; }
}
DL
// Extend the generated entity with custom behaviour
public partial class Customer : I_DL_Customer
{
}
BL
// Store a reference to the DL entity and define the properties shared for all entities
public abstract class BL_Entity<T> where T : I_DL
{
private T _entity;
public BL_Entity(T entity)
{
_entity = entity;
}
protected T entity
{
get { return _entity; }
set { _entity = value; }
}
public bool Active
{
get
{
return entity.Active;
}
set
{
entity.Active = value;
}
}
}
// The BL customer maps directly to the DL customer
public class BL_Customer : BL_Entity<I_DL_Customer>
{
public BL_Customer (I_DL_Customer o) : base(o) { }
public string Name
{
get
{
return entity.Name;
}
set
{
entity.Name = value;
}
}
}
答案 0 :(得分:2)
DTO-per-layer设计是最灵活和最模块化的。因此,它也是最可重用的:不要混淆重用相同实体的便利性和不同模块的可重用性,这是架构层面的主要关注点。但是,正如您所指出的,如果您的实体经常更改,这种方法既不是最快的开发方式,也不是最灵活的方法。
如果你想在各层之间共享实体,我不会经历通过不同层指定层次结构的麻烦;我要么让所有层直接使用EF实体,要么在所有层共享的不同程序集中定义这些实体 - 包括物理数据层,这可以直接通过EF代码保持这些实体,或者转换为/从那些共享实体到EF。