ayk*_*ayk 5 c# domain-driven-design ddd-repositories repository-pattern automapper
我对存储库域对象关系有一点了解.以下是我对域名设计所了解的一些信息(它们也可能是错误的或不准确的).考虑到这些,我找不到从存储库中获取域对象的方法.
在DDD中,域名应该只知道并包含业务所需的内容,其他所有内容都必须从域中清除.没关系.而且,从任何企业抽象数据访问也是一种很好的做法.应用程序不需要知道我们存储数据的位置或存储数据的方式.我们只要求存储库为我们提供一个域对象,它为我们提供了我们想要的对象,或者另一种方式也是有效的,我们给存储库一个域对象并将其发送到存储.
在面向对象设计中声明域对象的公共setter也是一种非常糟糕的方法,因为我们无法控制谁访问了什么并改变了什么.因此,最好只公开对象外部所需的内容.
因此,在我的脑海中,我无法找到实现我的存储库的方法.我可以在我的代码中使用任何ORM或纯sql并检索数据.
但我无法从持久性对象创建域对象;
任何帮助将不胜感激...
您有以下选择:
1. ORM 可以与私有字段一起使用。
据我所知,ORM(例如Entity Framework、NHibernate)可以通过非公共设置器设置属性。
有一个实体框架的例子证明了这一点——实体框架、私有构造函数和私有设置器。
如果您使用 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)