Onion Framework:用户界面/控制器是否应该直接访问存储库



在Onion框架中,外层可以访问所有内层。如果我这样做,我的外层(MVC中的UI层/控制器)也可以直接访问应用程序/业务服务和存储库。现在,我的控制器可以创建一个域模型,并通过使用repository将其持久化到数据存储中。从而绕过了在业务层中编写的验证和其他业务规则。我相信,我错过了什么。请帮忙。

public SpeakerController(IConferenceRepository conferenceRepository,
                         IUserSession userSession, IClock clock)
    : base(userSession) {
    _conferenceRepository = conferenceRepository;
    _clock = clock;
    _userSession = userSession; }

来自http://jeffreypalermo.com/blog/the-onion-architecture-part-2/

我说"不",尽管巴勒莫本人在推特对话中也表示不同意。我说,每个层都可以与下一个内层对话,而不是绕过它。我对这个规则的例外是,如果有问题的功能基本上只是参考数据的CRUD。我认为没有理由为这类数据引入额外的复杂性。

另一种选择是让您的存储库实现强制执行业务规则的验证。由于实现是在洋葱的最外层,所以这应该很容易做到

我发现Alistair Cockburn的六边形建筑比洋葱建筑更具启发性和简洁性。基本上有"我的应用程序内部"one_answers"应用程序外部"。任何时候你需要跨越这个边界,你都需要一个适配器来保护你的应用程序不受实现细节的影响。

最新更新