如何根据构建配置配置Simple Injector

时间:2015-09-01 08:57:40

标签: dependency-injection simple-injector

我希望能够为每个开发人员配置Simple Injector(例如用于原型设计)。 当然,默认配置应该是硬编码的。

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

开发人员不需要将他们的配置提交给源代码控制。

Simple Injector是否支持这种情况? 这种情况有没有最佳做法? 这根本没有意义,还是有更好的方法来达到我的目的?

1 个答案:

答案 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