我正在开始一个新的 MVC 项目,并且(几乎)决定尝试一下 Repository Pattern 和 Dependency Injection。筛选变化需要一段时间,但我为我的应用程序提出了以下结构:
- 表示层:ASP.Net MVC 前端(视图/控制器等)
- 服务层(业务层,如果您愿意):接口和 DTO。
- 数据层:接口实现和实体框架类。
在我的解决方案中,它们是 3 个独立的项目。表示层只有对服务层的引用。数据层也只有对服务层的引用——所以这基本上遵循领域驱动设计。
以这种方式构建事物的目的是为了关注点分离、松散耦合和可测试性。如果其中任何一项不合理,我很乐意就改进提出建议?
我遇到困难的部分是将接口实现对象从数据层注入到表示层,它只知道服务层中的接口。这似乎正是 DI 的用途,而 IoC 框架(据称!)使这更容易,所以我想我会尝试 MEF2。但是在过去几天我阅读的数十篇文章和问题和答案中,似乎没有什么能以适合我结构的方式真正解决这个问题。几乎所有这些都已弃用和/或都是简单的控制台应用程序示例,它们在同一个程序集中具有所有接口和类,彼此了解,完全无视松散耦合和 DI 的观点。
有一些解决方案探索基于属性的注册,但据说已经被基于约定的注册所取代。我还看到很多将对象注入控制器构造函数的示例,这引入了它自己要解决的一组问题。我不相信控制器实际上应该知道这一点,并且宁愿将对象注入模型中,但这可能是有原因的,因为很多示例似乎都遵循这条路径。我还没有深入研究这一点,因为我仍然坚持尝试将数据层对象放到任何地方的表示层中。
我相信我的主要问题之一是不了解各种 MEF2 需要在哪一层进行,因为我发现的每个示例都只使用一层。有容器、注册和目录以及导出和导入配置,我一直无法弄清楚所有这些代码应该放在哪里。
具有讽刺意味的是,现代设计模式本应抽象复杂性并简化我们的任务,但如果我刚刚从 PL 中引用 DAL 并着手处理应用程序的实际功能,我现在已经完成了一半。如果有人能说,‘是的,我明白你在做什么,但你缺少 xyz,我会非常感激。你需要做的是 abc'。
谢谢。