使用ActiveRecord,您可以定义一个这样的类:

class Contact
{
  private String _name;
  public String Name
  {
    get { return _name; }
    set
    {
      if (value == String.IsNullOrWhiteSpace())
        throw new ArgumentException(...);
      else
        _name = value;
    }
  }

  public Boolean Validate() { ... /* check Name is unique in DB */  }

  public Boolean Save() { ... }

  public static List<Contact> Load() { ... }
}


尽管这很好而且很简单,但我发现我的课程由于逻辑的混合而变得非常肿!

使用分层/域设计,您可以定义相同的类,例如:

class Contact
{
    [Required(AllowEmptyStrings=false)]
    public String Name { get; set; }
}

class ContactService : IService
{
    public List<Contact> LoadContacts() { return (new ContactRepository()).GetAll(); }
    public Contact LoadContact(int id) { return (new ContactRepository()).GetById(id); }
    public Boolean SaveContact(Contact contact)
    {
        if (new ContactValidator().Validate(contact))
            new ContactRepository().Save(contact);
    }
}

class ContactRepository : IRepository
{
    public List<Contact> GetAll() { ... }
    public Contact GetById(int Id) { ... }
    public Boolean Save(Contact contact) { ... }
}

class ContactValidator : IValidator
{
    public Boolean Validate(Contact contact) { ... /* check Name is unique in DB */ }
}

class UnitOfWork : IUnitOfWork
{
    IRepository _contacts = null;
    public UnitOfWork(IRepository contacts) { _contacts = contacts; }
    public Commit() { _contacts.Save(); }
}


它是如何从Active Record =>分层设计迁移的?


名称设置器中的实体级别验证=>保留(通过DataAnnotation允许)
业务逻辑/规则验证(唯一名称)=>从实体移至新的单独的ContactValidator
保存逻辑=>移到单独的存储库模式类(也带有UnitOfWork)
加载逻辑=>移至单独的存储库
与存储库的交互是通过新的ContactService(它将强制使用ContactValidator,ContactRepository,UnitOfWork等-而不是让调用者与ContactRepository失去联系!)。


我正在寻找这种分层设计的同行认可/建议-我通常不会在Active Record类型之外进行设计!任何评论表示赞赏。

注意:此示例故意简单(实际上并没有使用UnitOfWork,并且对Repository / Validator的更新将以不同的方式处理)。

最佳答案

这实际上取决于域逻辑的复杂程度。例如,如果我正在编写一个简单的博客,则活动记录会很好,主要是应用程序正在保存和加载数据。其简单而活跃的记录模式是完成此任务的正确工具。

但是,如果我正在为一家货运公司编写软件,在该公司中有许多复杂的业务规则和流程,那么从长远来看,使用存储库模式以及其他Domain Driven Design模式将提供更多可维护的代码。

使用域驱动设计,您将使用specification pattern进行验证。

10-08 11:34