【问题标题】:Looking for an MVC 3 + IoC for DI sample NTier empty solution stack为 DI 示例 NTier 空解决方案堆栈寻找 MVC 3 + IoC
【发布时间】:2012-05-15 23:32:55
【问题描述】:

是否有人为 .NET (C#) 创建了一个空的解决方案堆栈,其中包含使用多个项目的 DI 的 IoC 框架? 几个月来,我一直在努力创建一个良好的可重用堆栈:

  1. MVC UI 网页应用
  2. 空 BLL 项目(稍后将添加真实实体)
  3. 空 DAL 项目(稍后将添加真正的 daab 类)
  4. 参考/搜索数据层
  5. 包括一个 IoC 框架
  6. 家庭控制器中 DI 的使用示例,可​​以通过实体层一直到达 DAL 或通过接口到达所有参考/搜索层
  7. 不得在 UI 层设置任何具体类的硬引用

我已经尝试过几次,但我总是在 #6 上挂断,而且我缺少堆栈结构中的一些基本内容。有没有人设法做到这一点并有一个示例解决方案来展示它的结构?我可以整天创建堆栈并添加一个 IoC 框架,但完全无法使其结构化,因此没有将具体引用添加到 UI 层。对象的接口/具体解析还能如何进行?

当然,你们中的一些学者已经将其扼杀在萌芽状态,请与我分享一些启示:-)

ps - 我不止一次阅读 Mark Seeman 的书。我了解组合根的概念...但从未见过在 NTier 解决方案中使用它,并且无法成功实施该理论

我正在寻找的是一个包含多个项目的充实的解决方案堆栈,可以用作开始的基础。一种成功实现组合根的方法,可用于通过做而不是告诉来教授 SOLID 原则。一个将这一切变为现实的解决方案。请参阅此question 以供参考。

【问题讨论】:

  • 我不知道你说的#7 是什么意思。如果没有具体的类,你会发现很难做很多事情,特别是在 MVC 中,最佳实践规定了具体的 View Model 类,当然还有具体的控制器和其他类。我也不明白如果你没有实体可以“通过”,你怎么能做到 6。
  • 我想你误会了。具体存在但不能在 UI 层中硬引用。这就是整个想法对吧?解耦,因此可以将一个具体切换为另一个实现相同接口的具体。但是,如果具体很难引用,它仍然是切换实现的开发工作。所以要求是能够构造堆栈,使引用不在 UI 层中。这是它变得模糊的地方。其他人都在做什么?没有更高级的解决方案堆栈?
  • 基本上我在每个 IoC 示例中看到的问题是它的单个项目具有许多内部类和接口。假设所有依赖项都是 ctor 注入的。但是,如果在项目中硬引用了具体类,有什么可以阻止 jr 开发人员更新该类而不是使用注入的接口?
  • 我只是从一个空的解决方案开始,实体将在以后添加。空堆栈是构建的起点
  • 没有。 DI 并不是要减少重新编译。一般而言,它是关于减少耦合的。即使在一个项目中,您也可以减少耦合,并从中受益匪浅。它是关于使对象更易于测试,它是关于减少跨对象熟悉度,它是关于停止泄漏抽象。它与减少编译无关。事实上,这样的目标不太可行,因为必须加载程序集,而在大多数情况下,仅此一项就是一个硬参考。我想你可以使用 Xml 配置,但这会将你的 interals 暴露给配置文件。

标签: asp.net-mvc-3 visual-studio-2010 c#-4.0 dependency-injection inversion-of-control


【解决方案1】:

My Shuttle Wiki FOSS 包含您所追求的一些元素:

http://shuttlewiki.codeplex.com/

虽然不是每个问题都在其自己的项目/程序集中,但我发现将它们分开是不值得的,除非您真的要在其他地方使用相关的程序集。话虽如此,将它们分开仍然很容易,因为已经注意保持关注点的分离。

扫描了一些 cmets。我的观点是,不应使用任何项目结构或技术来试图阻止或保护其他开发人员使用某些类。初级开发人员必须在某个阶段学习技巧,一些快速的代码演练会发现与您想要实现的目标不一致的编码。

【讨论】:

  • 谢谢 Eben,我去看看。我并不是说这是我考虑架构的唯一原因,只是为了防止这种情况。我的目标只是“获得”成功理解、实施和可重复的组合根。我需要了解解决方案应如何构建以实现设计,即使我无法通过大规模解决方案完全实现它。但是我对如何构建堆栈的理解会增加
  • 希望对您有所帮助。组合根只是一个花哨的术语,表示调用依赖关系的位置。您会注意到,即使我有一个DependencyWiring 类,我也会在Application_Start 事件中调用它的方法。对于 WinForms 应用程序,它将在程序启动时进行。在更复杂的场景中,我有各种方法来执行不同的连线,因为它并不总是需要或与连线所有东西相关。例如,在 Windows 服务或网站中,WinForms 依赖项没有任何意义。
  • 我 100% 同意你的看法。阻止初级开发人员做事是做如此激烈的事情的可怕理由。我可以理解想要学习如何编写一个在主应用程序中没有依赖项的应用程序,但是这个问题的前提是尝试将其作为一个可以重用的项目模板,并打算将其用于所有事情。我只是觉得这种架构没有足够的好处来做这件事。
  • 就像我说的,这不是我寻找这个的唯一原因。我有很多原因要寻找这样的解决方案堆栈。为什么有人很难向我展示 NTier 解决方案如何利用 Ioc 框架进行 DI 的复杂性? @EbenRoux 是迄今为止唯一提出这样一个堆栈的人。我看到很多关于 IoC/DI 理论的讨论,以及为什么但没有真正的例子来利用实现 IoC/DI 的项目堆栈。单个项目,当然,但我在 10 年内还没有编写过使用 1 个单个项目的应用程序。
  • 我认为您将堆栈误解为模板。我的意思是它的部分可重用。这意味着,一个可以利用 IoC/DI 并按照我想要的方式工作的堆栈将具有可以在其他系统中使用的程序集。例如,堆栈中的程序集可能是实现 ProductRequest 接口的 LenderProductRequest 实体......我可以在其他几个解决方案中重用它。但是,如果我对堆栈以及它如何实现 DI 没有信心,因为我无法让布线系统工作,那么一切都不是。这是为了学习、教学、重用、培训其他开发人员 - 多方面的。
【解决方案2】:

看看我的: 使用存储库模式、ninject、实体框架 6、...

https://github.com/mesuttalebi/NTierCSharpExample

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-20
    • 2017-07-27
    • 2017-11-27
    • 2022-11-11
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多