我希望能够为每个开发人员配置Simple Injector(例如用于原型设计)。 当然,默认配置应该是硬编码的。
之前我使用过Unity,在那里我可以用XML配置文件覆盖硬编码注册。此配置文件不受源代码管理,因此其他开发人员可以使用自定义注册覆盖硬编码注册,而不会干扰其他注册。
开发人员不需要将他们的配置提交给源代码控制。
Simple Injector是否支持这种情况? 这种情况有没有最佳做法? 这根本没有意义,还是有更好的方法来达到我的目的?
答案 0 :(得分:4)
Simple Injector的设计决策之一是不支持基于XML的开箱即用配置。此决定描述为here,但可以概括为:
基于XML的配置很脆弱,容易出错并始终提供 基于代码的配置可以实现的子集。一般 共识是尽可能使用基于代码的配置 只回退到基于文件的部分配置 部署后确实需要自定义的配置。 这些通常只是少数几个注册 更改仍然需要开发人员交互(编写单元测试或 例如重新编译)。即使是那些确实需要的少数几行 可配置,要求完全限定的类型名称是一个坏主意 在配置文件中。配置开关(真/假或简单 enum)绰绰有余。您可以在中阅读配置的值 基于代码的配置,这允许您保留类型名称 你的代码。这使您可以轻松地重构,为您提供编译时 支持并且对必须改变这一点的人更加友好 配置文件。
然而,这并不能完全满足您的要求,因为您不希望在部署后可自定义"。相反,您希望为每个开发人员进行自定义。
对于这种特殊情况,您不应该依赖基于XML的配置IMO。正如您可以使用.gitignore排除xml文件一样,您可以对开发人员可以更改的基于代码的配置文件执行相同操作,并且将使用应用程序的其余部分进行编译。这是一个例子:
mailComposer.mailComposeDelegate = hostController;
[hostController presentViewController:mailComposer animated:YES completion:nil];
可以签入这两个文件,其中// Global.cs
public void Application_Start() {
var container = new Container();
// Default configuration here
container.Options.AllowOverridingRegistrations = true;
DeveloperOverrides.ApplyOverrides(container);
container.Options.AllowOverridingRegistrations = false;
DependencyResolver.Current = new SimpleInjectorDependencyResolver(container);
}
// DeveloperOverrides.cs
public static class DeveloperOverrides {
public static void ApplyOverrides(Container container) {
}
}
方法留空。之后,将DeveloperOverrides.cs排除在.gitignore文件中。
在此之后,开发人员可以添加由编译器检查的自己的覆盖,但永远不会签入源代码控制:
DeveloperOverrides.ApplyOverrides