Dependency injection 如何根据构建配置配置简单喷油器

Dependency injection 如何根据构建配置配置简单喷油器,dependency-injection,simple-injector,Dependency Injection,Simple Injector,我希望能够为每个开发人员以不同的方式配置简单的注入器(例如,为了原型化的目的)。 当然,默认配置应该是硬编码的 我以前使用过Unity,在那里我能够用XML配置文件覆盖硬编码的注册。此配置文件不受源代码管理,因此其他开发人员可以使用自定义注册覆盖硬编码注册,而不会干扰其他人 开发人员不需要向源代码管理提交他们的配置 简单注入器是否支持这种场景? 对于这种情况,有什么最佳实践吗? 这有意义吗,或者有更好的方法来实现我想要的吗?简单注入器的设计决策之一是不支持基于XML的开箱即用配置。该决定已被描述

我希望能够为每个开发人员以不同的方式配置简单的注入器(例如,为了原型化的目的)。 当然,默认配置应该是硬编码的

我以前使用过Unity,在那里我能够用XML配置文件覆盖硬编码的注册。此配置文件不受源代码管理,因此其他开发人员可以使用自定义注册覆盖硬编码注册,而不会干扰其他人

开发人员不需要向源代码管理提交他们的配置

简单注入器是否支持这种场景? 对于这种情况,有什么最佳实践吗?
这有意义吗,或者有更好的方法来实现我想要的吗?

简单注入器的设计决策之一是不支持基于XML的开箱即用配置。该决定已被描述,但可概括为:

基于XML的配置很脆弱,容易出错,并且总是提供 使用基于代码的配置可以实现的功能的子集。一般的 共识是尽可能多地使用基于代码的配置,并且 仅对系统的各个部分使用基于文件的配置 部署后确实需要自定义的配置。 这些通常只是少数注册,因为大多数 更改仍然需要开发人员交互(编写单元测试或 例如,重新编译)。即使是那几行确实需要 可配置的,要求完全限定的类型名不是一个好主意 在配置文件中。配置开关(真/假或简单 枚举)就足够了。您可以在数据库中读取配置的值 基于代码的配置,这允许您在 你的密码。这允许您轻松地进行重构,并为您提供编译时间 支持,并且对必须改变这一点的人更加友好 配置文件

然而,这并不能完全满足您的需求,因为您不希望“部署后可自定义”。相反,您希望根据开发人员进行自定义

对于这种特殊情况,您不应该依赖于基于XML的配置IMO。正如您可以使用.gitignore排除XML文件一样,您也可以对基于代码的配置文件执行相同的操作,开发人员可以更改这些文件,这些文件将与应用程序的其余部分一起编译。下面是一个例子:

//Global.cs
公共作废应用程序_Start(){
var container=新容器();
//此处的默认配置
container.Options.AllowOverridingRegistrations=true;
developeroverides.ApplyOverrides(容器);
container.Options.AllowOverridingRegistrations=false;
DependencyResolver.Current=新的SimpleInjectDependencyResolver(容器);
}
//developerVerrides.cs
公共静态类developerVerrides{
公共静态无效应用程序覆盖(容器){
}
}
这两个文件可以签入,其中
DeveloperOverrides.ApplyOverrides
方法保留为空。之后,将developerVerrides.cs的排除添加到.gitignore文件中

在此之后,开发人员可以添加自己的重写,这些重写由编译器检查,但从未签入到源代码管理中:

//developerVerrides.cs
公共静态类developerVerrides{
公共静态无效应用程序覆盖(容器){
容器。登记(生活方式。单身);
}
}

谢谢,这看起来比使用XML配置文件更好。