Asp.net mvc 使用依赖项注入组织ASP.NETMVC解决方案的最佳方式是什么?

Asp.net mvc 使用依赖项注入组织ASP.NETMVC解决方案的最佳方式是什么?,asp.net-mvc,dependency-injection,inversion-of-control,structuremap,Asp.net Mvc,Dependency Injection,Inversion Of Control,Structuremap,我在开发一个新的ASP.NETMVC项目的早期,我使用这个项目进入DI。我很确定我会选择结构图,但这不是我要问的。我想弄清楚的是如何最好地组织我的解决方案。单元测试项目和模型是否都获得了一个配置文件来映射它们的依赖关系,或者是否有一个类来管理它们 还有,在我进入这个领域之前,有没有什么新手陷阱需要避免 非常感谢大家 更新 我应该补充一点,当我说“组织解决方案”时,我不是指文件/文件夹的数量等,而是指如何构造与DI相关的类。特别是,如何管理引导程序。我可以看出我的措辞不当可能会造成混乱。如果你是唯

我在开发一个新的ASP.NETMVC项目的早期,我使用这个项目进入DI。我很确定我会选择结构图,但这不是我要问的。我想弄清楚的是如何最好地组织我的解决方案。单元测试项目和模型是否都获得了一个配置文件来映射它们的依赖关系,或者是否有一个类来管理它们

还有,在我进入这个领域之前,有没有什么新手陷阱需要避免

非常感谢大家

更新
我应该补充一点,当我说“组织解决方案”时,我不是指文件/文件夹的数量等,而是指如何构造与DI相关的类。特别是,如何管理引导程序。我可以看出我的措辞不当可能会造成混乱。

如果你是唯一一个参与该项目的人,我会先做对你有意义的事。没有什么比把一个目录或项目结构强加给您而使您觉得不直观更糟糕的了。BaseController类是在\Core\文件夹中还是在\Controller\文件夹中?就个人而言,我会查看控制器,但有些人发誓它应该在\Core\或\base中

第一个新手陷阱是认为您可能会以错误的方式组织代码,这在某种程度上反映了项目的成功。我见过一个文件夹中有30个文件的项目,还有一个文件夹中有20个文件夹中有30个文件的项目

第二个新手陷阱是忘记了与其他语言相比,您拥有来自Visual Studio的卓越intellisense、代码导航工具和重构支持的优势。您还有一个编译器,它可以大大减少文件的错误放置。如果你把东西放在“错误”的地方,没关系,你总能找到它并把它拖到需要的地方

老实说,我现在正在做一个项目,我甚至不确定某些类在我的文件结构中的位置。“转到定义/声明”是我经常使用的键盘快捷键。因为只有我在处理代码,这很好。如果我必须在项目中添加另一个开发人员,我可能会把事情清理干净

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

随着依赖注入的加入,我建议您只关注名称空间爆炸。你能做的最糟糕的事情就是用长使用声明和别名把引导程序和文件弄得乱七八糟

ForRequestedType<Customer>

ForRequestedType
避免此问题的另一种方法是在命名事物时显式命名:Customer、CustomerViewModel、CustomerController、CustomerDataRow、CustomerView

对于TDD,您几乎必须有两个引导程序来管理您的具体类型。您确实不希望单元测试使用AuthorizeNetGateway:IPaymentGateway,而希望使用StubGateway:IPaymentGateway

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

我通常也会保留MVC应用程序的默认结构。让代码与99%的教程和视频具有相同的结构更容易


希望这有帮助。

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

我在主项目中的“名称空间目录”(namespace directory)(/Config)中有我的DI代码,但在我的集成代码测试中,如果我在基本装置或设置中需要,我可能只调用这些注册表或重写它们

例如

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

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

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


我不会分裂到项目。Bootstraper和。域,直到我绝对必须。。。三个项目,X,X。单元测试,X。集成,如果你以后需要更多的移动。我来自一家背景/公司,有几十个项目,第一次感觉不干净,但不是现在,我会快速增长,并在需要时重新组织解决方案结构。

这是我第一次尝试为自己解决同样的问题,但由于这是我的第一次尝试,我希望人们能够对其进行评论或批评,就像我希望它可以作为您的一个可能解决方案一样:

public VatManager()
 : this(new VatManagerRegistry()) { }

public VatManager(Registry registry)
 : this(new Action<IInitializationExpression>(x => { x.AddRegistry(registry); }))
  {
  }

public VatManager(Action<IInitializationExpression> action)
  {
   ObjectFactory.Initialize(action);
   data = ObjectFactory.GetInstance<IVatManagerData>();
  }
public-VatManager()
:此(新的VatManagerRegistry()){}
公共事务经理(注册处)
:此(新操作(x=>{x.AddRegistry(注册表);}))
{
}
公共事务经理(行动)
{
初始化(操作);
data=ObjectFactory.GetInstance();
}
我有三个构造函数重载-无参数默认构造函数知道需要创建以在生产上下文中使用的具体StructureMap注册表。另外两种方法允许实例化此管理器类的其他代码提供自己的StructureMap注册表或操作,以便它们可以自己控制依赖项注入,例如在自动测试中提供模拟而不是这些依赖项的具体实例。 我应该补充一点,这个解决方案不是particu
ForRequestedType<KevDog.Models.Customer>
public VatManager()
 : this(new VatManagerRegistry()) { }

public VatManager(Registry registry)
 : this(new Action<IInitializationExpression>(x => { x.AddRegistry(registry); }))
  {
  }

public VatManager(Action<IInitializationExpression> action)
  {
   ObjectFactory.Initialize(action);
   data = ObjectFactory.GetInstance<IVatManagerData>();
  }