代码之家  ›  专栏  ›  技术社区  ›  Les

ASP.NET MVC/DDD体系结构帮助

  •  1
  • Les  · 技术社区  · 17 年前

    我正在使用ASP.NET MVC创建一个Web应用程序,并尝试使用域驱动的设计。我有一个建筑学问题。

    我有一个WebControl表来存储列表的键和值,以便它们可以编辑。我已经将它纳入了我的业务模型中,但这会导致大量的冗余代码,我不确定它是否属于这些代码。例如,在我的请求类中,我有一个名为needType的属性。因为它来自一个列表,所以我创建了一个NeedType类来提供单选按钮的值。我在这里只展示一个示例,但是表单中可能会有十几个列表需要来自数据库。

    [编辑,澄清问题]这样做的更好方法是什么?这些列表对象真的是我的域的一部分,还是它们只存在于UI中?如果不是域的一部分,那么它们不属于我的核心项目,那么它们去哪里呢?

    public class Request : DomainObject
    {
       public virtual int RequestId { get; set; }
       public virtual DateTime SubmissionDate { get; set; }
       public virtual string NeedType { get; set; }
       public virtual string NeedDescription { get; set; }
       // etc.
    }
    
    public class NeedType : DomainObject
    {
        public virtual int NeedTypeId { get; set; }
        public virtual string NeedTypeCode { get; set; }
        public virtual string NeedTypeName { get; set; }
        public virtual int DisplayOrder { get; set; }
        public virtual bool Active { get; set; }
    }
    
    public class RequestController : Controller
    {
        private readonly IRequestRepository repository;
    
        public RequestController()
        {
            repository = new RequestRepository(new HybridSessionBuilder());
        }
    
        public RequestController(IRequestRepository repository)
        {
            this.repository = repository;
        }
    
        public ViewResult Index(RequestForm form)
        {
            ViewData.Add("NeedTypes", GetNeedTypes());
            if (form == null)
            {
                form = new RequestForm();
                form.BindTo(repository.GetById(125));
            }
        }
    
        private NeedType[] GetNeedTypes()
        {
            INeedTypeRepository repo = new NeedTypeRepository(new HybridSessionBuilder());
            return repo.GetAll();
        }
    }
    
    3 回复  |  直到 17 年前
        1
  •  3
  •   Paco    17 年前

    使用视图中需要的数据创建单独的视图模型。MVC的m中的模型与域模型不同。MVC视图模型是愚蠢的DTO,没有行为,只有属性。域模型具有尽可能多的行为。具有get;set;properties的域模型只被认为是一种称为“贫血域模型”的反模式。大多数人在两个地方放置视图模型:在Web层中,靠近视图和控制器,或者在应用程序服务层中。

    编辑:

    当您只需要显示数据库中所有需求类型的列表和视图中的一个请求时,我确实会创建一个视图模型,其中请求和需求类型列表作为属性。我不认为调用控制器中的多个存储库是一种味道,除非您有一个更大的应用程序,并且您可能需要一个单独的应用程序服务层,用一个方法调用返回整个ViewModel。

    我认为遵循托德·史密斯关于价值对象的建议也是一个好主意。 当用户可以在运行时添加或编辑NeedType时,NeedType应该是一个实体。当needtypes是硬编码的并且只随项目的新版本而更改时,needtype应该是一个值对象,needtypes的列表可以由needtype.getall()之类的东西填充,并通过向请求表中添加一列而不是单独的needtype表存储在数据库中。

        2
  •  1
  •   Samantha Branham    17 年前

    如果它来自一个列表,那么我打赌这是一个外键。在设计域模型时,完全不要考虑您的UI。这只是needType是一个外键的情况。将字符串needtype替换为对实际needtype对象的引用。在数据库中,这将是对ID的引用。

    当您构建需求类型选择列表时,只需拉取每个需求类型。如果变化不大的话,把它保存在缓存中可能是个好主意。

        3
  •  1
  •   Todd Smith Brandon    17 年前

    对我来说,您的needType看起来像一个值对象。如果它是只读数据,那么它应该在DDD体系结构中被视为一个值对象,并且是域的一部分。

    很多人在处理DDD时会遇到“OMG如此多的冗余”问题,因为您不再使用旧的数据库->dataTable->ui方法。