如果接口是在业务层而不是数据访问层中定义的,则您不了解接口

use*_*050 1 c# domain-driven-design dependency-injection n-tier-architecture

请有人帮我澄清一下我依赖倒置原则的问题.如果我在DAL中有一个看起来像这样的存储库,并且在DAL中有相应的接口.我基本上是对那些会使用我的DAL的人说,"这是一个名为'FindEvents'的接口,这是我通过接口签订的合同.所以开发人员知道不要直接使用该对象,而是使用我的界面.我可以甚至将对象设为私有,只将接口公开为public

达尔 -

public class YogaSpaceEventRepository : IYogaSpaceEventRepository
{
    public IQueryable<YogaSpaceEvent> FindEvents(DateTime start, DateTime end)
    {
    // Retrieve Data from Database
    }
} 

public interface IYogaSpaceEventRepository : IDisposable
{
    // here my repo (data access layer) is referencing my business layer to return YogaSpaceEvent
    IQueryable<YogaSpaceEvent> FindEvents(DateTime start, DateTime end); 
}
Run Code Online (Sandbox Code Playgroud)

但是如果我取出这个界面并将其粘贴在BLL(DDD方法)中,那么我可以避免循环引用(DAL需要引用BLL来理解它正在返回的对象'YogaSpaceEvent'以及我需要调用的BLL中的某个地方FindEvents - 现在它是循环的).这完全打破了界面规则!?因为现在如果DAL开发人员移交DAL程序集,那么作为使用该DAL程序集的开发人员将不知道可以更改的内容(没有合同 - DAL中没有接口)!

通过推杆

public interface IYogaSpaceEventRepository : IDisposable
{
    // here my repo (data access layer) is referencing my business layer to return YogaSpaceEvent
    IQueryable<YogaSpaceEvent> FindEvents(DateTime start, DateTime end); 
}
Run Code Online (Sandbox Code Playgroud)

你是不是打破了界面的一个规则?这是一个契约 - DAL的开发不能说这是我的库,我只保证这个界面里有什么.现在没有接口,因此没有合同.

请有人在这里给我一些反馈!

Mar*_*ann 7

如果你去依赖倒置原则的来源,你会看到:

"客户[...]拥有抽象界面"(第11章)

因此,接口不应该进入DAL,而应该进入使用该接口的库中.

在那里,遵守其他SOLID原则也很重要,在这种情况下尤其是接口隔离原则,因此不要在接口上放置比客户端要求更多的成员.

在构图方面,您可能会发现以下内容: