.Net体系结构持久层和InternalsVisibleTo上的清洁体系结构问题

2ic8powd  于 2023-02-26  发布在  .NET
关注(0)|答案(1)|浏览(260)

假设我有一个具有只读Id属性的实体,如下所示:

public int Id { get; }

然后我有一个持久层,它实现实体存储库,并在实体存储到db时分配新的Id值:

public async Task AddToDb(MyEntity ent) { ... };

现在,这个方法可以通过阅读从Db返回一个实体,但是我不喜欢发出另一个网络请求(在这种情况下没有并发性)。所以我最好为传递的实体分配新的ID。但是Id是只读的。我想通过使用InternalsVisibleTo属性使持久层对域层“友好”。
嗯,这看起来有点古怪,我知道数据库应该是真相的来源。还有其他选择吗?我是不是做了完全不必要/错误的事情?

beq87vna

beq87vna1#

此处,除了使用InternalsVisibleTo之外,还有几个可能的选项:
1.您可以使用C#9中引入的init访问器来完成您所需要的工作?
公共整数Id { get;初始化; }
这将允许您将属性保持为只读,但您可以在对象初始化时分配它。
1.遵循更多的CQRS方法,并具有“分离的数据持久模型”和“数据视图模型”,并从“创建新对象视图模型”中省略id属性,使持久模型中的id属性可设置(或如前所述不可初始化),然后在实际提交到数据库之前从持久层返回id:
在面向外部的项目中(视图或API或其他)

public MyEntityViewModel()
{ 
  string SomeProperty { get; set;}
}

然后在持久层中

public MyEntity()
{ 
   public int Id { get; init; }
   string SomeProperty { get; set;}
}

public async Task<int> AddToDb(MyEntityViewModel ent) 
{
   var newEnt = new MyEntity(){ Id = 1234 };
   
   //map the contents of the ViewModel to the peristance Model
   newEnt.SomeProperty = ent.SomeProperty;

   ///code to commit to DB.

   return newEnt.Id;
};

有各种各样的讨论可以在这里有关于每个模型将生活在哪里,哪个程序集应该有责任的Map等,但我希望这传达了一般的想法。
1.使Id属性可设置,然后简单地在公共异步任务AddToDb(MyEntity ent)中用持久层确定的值覆盖它。这可以说是最简单的选项,它允许持久层进行最终控制,而不必执行大量费力的逻辑。

相关问题