如何从存储库中检索域对象

ayk*_*ayk 5 c# domain-driven-design ddd-repositories repository-pattern automapper

我对存储库域对象关系有一点了解.以下是我对域名设计所了解的一些信息(它们也可能是错误的或不准确的).考虑到这些,我找不到从存储库中获取域对象的方法.

在DDD中,域名应该只知道并包含业务所需的内容,其他所有内容都必须从域中清除.没关系.而且,从任何企业抽象数据访问也是一种很好的做法.应用程序不需要知道我们存储数据的位置或存储数据的方式.我们只要求存储库为我们提供一个域对象,它为我们提供了我们想要的对象,或者另一种方式也是有效的,我们给存储库一个域对象并将其发送到存储.

在面向对象设计中声明域对象的公共setter也是一种非常糟糕的方法,因为我们无法控制谁访问了什么并改变了什么.因此,最好只公开对象外部所需的内容.

因此,在我的脑海中,我无法找到实现我的存储库的方法.我可以在我的代码中使用任何ORM或纯sql并检索数据.

但我无法从持久性对象创建域对象;

  1. 由于他们没有公共设置器,我无​​法创建和设置字段值.
  2. 声明包含所有字段的公共构造函数似乎不正确.我可能有几个模型要填写,这意味着我必须定义几个具有不同参数集的构造函数.

任何帮助将不胜感激...

Ily*_*kin 4

您有以下选择:

1. ORM 可以与私有字段一起使用。

据我所知,ORM(例如Entity FrameworkNHibernate)可以通过非公共设置器设置属性。

有一个实体框架的例子证明了这一点——实体框架、私有构造函数和私有设置器

如果您使用 NHibernate,您的 setter 应该是public/protected virtual/protected internal virtual或者private可以使用支持字段。您可以在 NHibernate SO 问题中的属性访问策略中找到更多信息。

2.可以使用反射。

它也可用于访问私有字段/属性。可以通过反射设置私有属性

3. 使用公共构造函数来构造实体并不是一个坏习惯。

声明包含所有字段的公共构造函数似乎不正确。我可能有几个模型需要填写,这意味着我必须定义几个具有不同参数集的构造函数。

您的域实体只需要一个公共构造函数及其所拥有的属性的完整列表。尽管有多个模型需要填充,但只有一个构造函数就足够了。存储库有责任正确调用构造函数并将模型映射到其参数中。

编辑:

4.可以使用Automapper 。

以下测试显示AutoMapper可以通过私有 setter 映射属性。

[TestClass]
public class AutomapperTest
{
    [TestMethod]
    public void Test()
    {
        // arrange
        Mapper.CreateMap<AModel, A>();
        var model = new AModel { Value = 100 };

        //act
        var entity = Mapper.Map<A>(model);

        // assert
        entity.Value.Should().Be(100);
        entity.Value.Should().Be(model.Value);
    }
}

public class AModel
{
    public int Value { get; set; }
}

public class A
{
    public int Value { get; private set; }
} 
Run Code Online (Sandbox Code Playgroud)