【发布时间】:2015-02-03 11:34:26
【问题描述】:
所以我正在重构一个由通过 NHibernate 访问的 SQLite 数据库支持的中小型 Windows 窗体应用程序。当前的解决方案仅包含一个 App 项目和一个 Lib 项目,因此它的结构不是很好,并且在很多地方都紧密耦合。
我从this answer 中的结构开始,但后来遇到了一些问题。
- 数据库初始化: 由于构建 NHibernate SessionFactory 的代码位于 DAL 中,并且我需要将 ISession 注入到我的存储库中,因此我需要在我的 Forms 项目中直接引用 DAL 和 NHibernate 才能使用 Ninject 设置 DI(应该这样做在应用程序项目/表示层中对吗?)
这难道不是我试图通过这种架构避免的事情之一吗?
在理想世界中,哪些项目应该相互引用?
-
一般的 DI:
我很难弄清楚如何正确地进行 DI。我读到了使用组合根只有一个地方可以直接使用 Ninject 容器,但这与当前使用 NHibernate Sessions 的方式并不能很好地配合。
我们有一个
MainForm,它显然是应用程序的入口点,并在其整个生命周期内保持一个会话。此外,用户可以打开多个SubForms(主要但不限于)用于编辑单个实体)当前每个实体都有一个单独的会话,生命周期较短。这是通过静态 Helper 公开 SessionFactory 并根据需要打开新 Session 来完成的。
除了组合根模式之外,还有另一种在 Windows 窗体中使用 DI 的方法吗?
如何利用 Ninjects 功能进行范围注入,以按表单管理我的 NHibernate 会话(如果可能的话)?
-
术语:
我对什么是
Repository和Service有点困惑。对已发布答案的一条评论指出“存储库可以包含业务逻辑,在这种情况下您可以将其称为服务”。当我们经常想将过滤等推送到数据库中时,我们的存储库只包含基本的 CRUD 操作,感觉有点没用。所以我们继续使用GetByName或更复杂的GetAssignmentCandidates等方法扩展存储库。感觉很合适,因为实现是在业务层中,但它们仍然被称为存储库。我们还使用了Controllers用于直接与 UI 元素交互的类,但我认为这个名称在网络世界中更常见。
我们的Repositories 真的应该叫Services吗?
对不起,文字墙。任何答案将不胜感激!
【问题讨论】:
标签: c# winforms nhibernate dependency-injection ninject