模型可以包含存储库参考吗?

could model contains repository reference?

我的域模型可以引用我的存储库接口吗?或者更好,包含我的存储库定义?

我问是因为我在想我在互联网上读到的内容说模型不应该知道它的持久性,但我认为如果存储库存在是因为模型,我的意思是,处理特定的它的模型需要,为什么模型项目不定义它?

如果我执行以下操作,这是一个问题/糟糕的设计吗?

public interface ISomethingThatNeedToBeAprovedRepository
{
   void Save(SomethingThatNeedToBeAproved somethingThatNeedToBeAproved);
}

public class SomethingThatNeedToBeAproved
{
    public int Status {get;set;}
    public string Reason {get;set;}

    public ISomethingThatNeedToBeAprovedRepository Repository{ get; set;}

    public void Aprove(status, reason)
    {
        DoSomeAsserts();
        Status = status;
        Reason = reason;

        Repository.save(this);
    }

}

是的,可以!

在给定的时间点,您需要保留聚合,因此需要存储库。我曾经在我的域模型中使用 IRepository,而在另一个项目中使用存储库的基础设施细节。

不,这将是一个糟糕的设计。 领域模型(这个领域层)应该完全独立于任何其他层。 存储库接口和实现应该参考域模型来保存和执行存储操作。

答案真的要看情况了。

正如@marianoc84 所说,在某些时候,应用程序确实需要关注持久性。这里的问题是,特定领域模型是否需要关注数据持久性? 如果是这样,那么在模型中放置一个存储库是有意义的。

另一方面,将存储库放在 'may' 中会使单元测试更具挑战性,请注意,一般来说,域模型可以分布在任何地方,几乎可以分布到应用程序层。

但是,如果模型真的不需要关心持久性,那么你真的不需要里面的存储库。持久化可以在其他地方完成,例如有一个 'ApprovalServices',在这种情况下,可能有几个 A、B、C、D 和 E 可以被批准并被持久化。