Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DDD溶液结构_C#_Mongodb_Repository_Domain Driven Design_Clean Architecture - Fatal编程技术网

C# DDD溶液结构

C# DDD溶液结构,c#,mongodb,repository,domain-driven-design,clean-architecture,C#,Mongodb,Repository,Domain Driven Design,Clean Architecture,我正在尝试为一个新的DDD项目创建一个很好的解决方案结构。我创建了一个核心项目,在其中添加了实体、ValueObjects和存储库接口,然后添加了一个基础设施项目,其中包含以前IRepository的实现 现在,由于我的db将是MongoDb,我需要在实体的一些字段中添加像[BsonDateTimeOptions]这样的属性,这将需要在核心项目中添加对MongoDb驱动程序包的引用 既然核心项目不应该包含对MongoDb的任何引用,它应该只包含业务逻辑,并且应该可以在任何其他项目mobile-X

我正在尝试为一个新的DDD项目创建一个很好的解决方案结构。我创建了一个核心项目,在其中添加了实体、ValueObjects和存储库接口,然后添加了一个基础设施项目,其中包含以前IRepository的实现

现在,由于我的db将是MongoDb,我需要在实体的一些字段中添加像[BsonDateTimeOptions]这样的属性,这将需要在核心项目中添加对MongoDb驱动程序包的引用

既然核心项目不应该包含对MongoDb的任何引用,它应该只包含业务逻辑,并且应该可以在任何其他项目mobile-Xamarin中重用,那么在这种情况下,什么是最佳实践呢

我能想到的是:

实体将不包含对MongoDb的任何引用 在Infrastructure projects中为每个实体创建一个模型,该模型是相关实体的副本,但具有MongoDb属性。 在存储库中创建一个层?它能够使用模型在数据库中进行查询,然后在实体中对其进行转换,从而返回实体,将模型对象隐藏在存储库中。 这种方法有一个问题,我将有一个实体的副本,即仅具有MongoDb属性的模型,并且在向实体添加一些字段时,我还必须修改模型。这是正确的方法吗


一切都从解决方案结构开始。

是的,您描述的方法是正确的,但您在repo中所称的层,将只是基础结构层中的适配器。适配器使用mongodb技术实现repo接口,并使用映射器在两个模型之间进行转换。映射器也属于基础结构层

注意:我不使用C,但它在PHP中工作,可能对您有所帮助

我这样做的方式是将聚合根、嵌套实体和值对象创建为普通对象数据+行为,而不依赖于基础设施/技术。然后,在持久化/再水化时,我使用反射存储/加载存储库中的聚合。存储库正在将任何已知域对象映射到基础结构对象。例如,原语类型string、bool、int、float、null存储时不进行任何转换。将转换为,将Guid转换为,依此类推


这是可能的,因为反射和简单,因为MongoDB将对象存储为JSON,并且阻抗不匹配很少或没有。

不要在域类中使用属性,而是在基础结构层编写配置代码

这似乎总是MongoDB.NET的一个选项,例如

BsonClassMap.RegisterClassMap<MyClass>(cm => 
{
    cm.AutoMap();
    cm.MapMember(c => c.DateOfBirth).SetSerializer(new DateTimeSerializer(dateOnly: true));
}

我要做的是像你说的那样制作两个不同的实体副本。一个用于数据库,一个用于实际实体。我还将使用某种类型的接口来保存实体的属性,这样做您只需要更新接口,然后您就可以使用autopopulate在模型中进行更改。这正是我所想的。但是@guillaume31发布的应该是什么呢?我需要尝试一下我正在搜索的东西,无论如何,我将对此进行投票,因为如果司机没有提供这种语法,我应该选择这条路。@DavideQuaglio,但你必须编写大量的锅炉板代码。我喜欢通用的解决方案。我想我会使用一些反射来减少它。我想这正是我一直在寻找的。我现在就要试着用这种方式来实现它
[BsonDateTimeOptions(DateOnly = true)]
public DateTime DateOfBirth { get; set; }