假设我有一个具有只读Id属性的实体,如下所示:
public int Id { get; }
然后我有一个持久层,它实现实体存储库,并在实体存储到db时分配新的Id值:
public async Task AddToDb(MyEntity ent) { ... };
现在,这个方法可以通过阅读从Db返回一个实体,但是我不喜欢发出另一个网络请求(在这种情况下没有并发性)。所以我最好为传递的实体分配新的ID。但是Id
是只读的。我想通过使用InternalsVisibleTo
属性使持久层对域层“友好”。
嗯,这看起来有点古怪,我知道数据库应该是真相的来源。还有其他选择吗?我是不是做了完全不必要/错误的事情?
1条答案
按热度按时间beq87vna1#
此处,除了使用InternalsVisibleTo之外,还有几个可能的选项:
1.您可以使用C#9中引入的init访问器来完成您所需要的工作?
公共整数Id { get;初始化; }
这将允许您将属性保持为只读,但您可以在对象初始化时分配它。
1.遵循更多的CQRS方法,并具有“分离的数据持久模型”和“数据视图模型”,并从“创建新对象视图模型”中省略id属性,使持久模型中的id属性可设置(或如前所述不可初始化),然后在实际提交到数据库之前从持久层返回id:
在面向外部的项目中(视图或API或其他)
然后在持久层中
有各种各样的讨论可以在这里有关于每个模型将生活在哪里,哪个程序集应该有责任的Map等,但我希望这传达了一般的想法。
1.使Id属性可设置,然后简单地在公共异步任务AddToDb(MyEntity ent)中用持久层确定的值覆盖它。这可以说是最简单的选项,它允许持久层进行最终控制,而不必执行大量费力的逻辑。