使用依赖注入组织ASP.Net MVC解决方案的最佳方法是什么?

Kev*_*Dog 14 structuremap asp.net-mvc dependency-injection inversion-of-control

我在一个新的ASP.Net MVC项目的早期开发,我使用这个项目进入DI.我很确定我会选择结构图,但这不是我要问的问题.我想弄清楚的是如何最好地组织我的解决方案.单元测试项目和模型都可以获取配置文件来映射它们的依赖关系,还是有一个类来统治它们?

另外,在我走得太远之前,还有什么新手陷阱可以避免吗?

非常感谢,所有.....

更新 我应该补充一点,当我说"组织解决方案"时,我并不是指文件/文件夹的数量等,而是如何构建与DI相关的类.特别是,如何管理引导程序.我可以看到我的言语不好会导致混乱.

Joh*_*ell 11

如果你是唯一一个从事这个项目的人,我会先做对你有意义的事情.没有比你发现不直观的目录或项目结构更糟糕的事情.BaseController类是\ Core \文件夹还是\ Controller \文件夹?我亲自看看控制器,但有些人发誓它应该在\ Core \或\ Bases中.

一个新手陷阱认为你可以用错误的方式组织你的代码,并以某种方式反映了项目的成功.我见过有30个文件放在一个文件夹中的项目和其他有30个文件夹有20个文件夹的项目.

第二个新手陷阱是忘了其它语言相比,你有真棒智能感知,代码导航工具,并从Visual Studio的重构支持的好处.你还有一个编译器,它使错误放置文件远没那么痛苦.如果你把某些东西放在"错误"的位置,那么你可以随时找到它并将它拖到需要的地方.

老实说,我现在正在研究一个项目,我甚至不确定某些类在我的文件结构中的位置.转到定义/声明是我经常使用的键盘快捷键.因为只有我使用代码这很好.如果我不得不在项目中添加另一个开发人员,我可能会清理一下.

我个人倾向于将Interfaces的实现类型放在同一个文件夹中.IPaymentGateway与AuthorizeNetGateway和PaypalGateway位于同一文件夹中.如果我无法在解决方案资源管理器侧栏中一次查看该文件夹中的所有文件,则将所有网关文件移动到\ Gateway \文件夹中.

随着依赖注入添加到混合中,我建议你只关注命名空间爆炸.你可以做的最糟糕的事情是使用声明和别名长时间搞乱你的bootstrappers和文件.

ForRequestedType<Customer>
Run Code Online (Sandbox Code Playgroud)

比...更干净

using KevDog.Models
using Customer=KevDog.Models.Customer
Run Code Online (Sandbox Code Playgroud)

要么

ForRequestedType<KevDog.Models.Customer>
Run Code Online (Sandbox Code Playgroud)

另一种避免此问题的方法是在命名时明确:Customer,CustomerViewModel,CustomerController,CustomerDataRow,CustomerView

对于TDD,您几乎必须有两个bootstrappers来管理您的具体类型.你真的不希望你的单元测试使用AuthorizeNetGateway:IPaymentGateway,而不是StubGateway:IPaymentGateway.

现在我也是DI的新手,所以我倾向于使事情变得非常简单并反映101级教程和文档.只有在特定情况需要时才能使用基于构建配置的动态注入,并且您确切知道为什么要这样做.

我通常也保留MVC应用程序的默认结构.它的代码与99%的教程和视频相同,更容易.

希望这可以帮助.


小智 2

鼓励更好的 TDD。有两个测试项目和/或命名空间 X.Unit.Tests 和 X.Integrations.Tests。

我的 DI 代码位于我的主项目中的“命名空间目录”(/Config) 中,但在我的集成代码测试中,如果我的基本装置或设置需要,我可能只调用这些注册表或覆盖。

例如

/Config/ServiceRegistry.cs /Config/RepositoryRegistry.cs /Config/Bootstrapper.cs

在 global.asax 中,我调用 Bootstrapper.Init() ,这将调用 x.AddRegistry(new ServiceRegistry()) 等等。

在我的单元测试中,您不需要仅在集成测试中使用 DI。在我的 IntegrationTests 中,例如,如果我正在测试 NHibernate 到数据库,我可能会使用 TestSetUp 中的 RepositoryRegistry 来初始化 SM,并使用仅包装 GetInstance() 的辅助方法。

我不会拆分为项目 .Bootstraper 和 .Domain,直到我绝对必须...三个项目,X、X.UnitTests、X.Integration(如果您稍后需要更多移动)。我来自一个有数十个项目的背景/公司,第一次减少感觉很脏,但现在不是,我会快速增长,并在需要时重新组织解决方案结构。