Configuration 应该在代码或配置文件中配置Unity吗?

Configuration 应该在代码或配置文件中配置Unity吗?,configuration,dependency-injection,unity-container,app-config,ioc-container,Configuration,Dependency Injection,Unity Container,App Config,Ioc Container,Microsoft的Unity依赖项注入框架可以通过代码或应用程序配置文件(app.config)进行配置 代码示例: IUnityContainer container = new UnityContainer() .RegisterType<IInterface, ConcreteImplementation>(); IUnityContainer container=newunitycontainer() .RegisterType(); 配置示例: <uni

Microsoft的Unity依赖项注入框架可以通过代码或应用程序配置文件(app.config)进行配置

代码示例:

IUnityContainer container = new UnityContainer()
    .RegisterType<IInterface, ConcreteImplementation>();
IUnityContainer container=newunitycontainer()
.RegisterType();
配置示例:

<unity>
    <containers>
        <container>
            <types>
                <type type="IInterface, MyAssembly"
                      mapTo="ConcreteImplementation, MyAssembly" />


每种方法的优点/缺点是什么?我可以想到明显的优点“用户可以轻松配置您的应用程序”,明显的缺点“用户可以轻松破坏您的应用程序”,但还有什么不那么明显的吗?

XML配置实际上只对一件事有利:后期绑定。通过XML配置,您可以更改应用程序的组成方式,而无需重新编译整个应用程序。这尤其适用于支持一定程度用户配置的ISV应用程序。ISV可以提供具有默认行为的已编译应用程序,但允许客户/用户通过更改配置来更改部分行为

然而,XML配置是脆弱且冗长的。从开发人员的角度来看,这只是一个痛苦的工作

  • 重命名类型或程序集时,配置往往会中断
  • 您必须手动将适当的.dll复制到输出目录(或者让生成脚本执行此操作)
  • 总的来说,冗长的文字让人难以理解
  • 工具支持比强类型代码弱

根据经验,更喜欢代码作为配置。但是,您可以将代码配置与XML配置相匹配,因此,如果您有一些应该是后期绑定的依赖项,您可以使用XML配置来实现这些依赖项。

问题已经得到了回答,但我想总结一下我的经验:

两者都用。 我将代码配置隐藏到扩展中,当我有几个标准配置(通常是因为我使用IoC)时,我就有几个共享主配置的扩展


我将XML配置用于非标准任务,如性能调优(在重新编译需要很长时间的环境中)

通过代码进行配置的一个显著缺点是代码需要引用程序集。这意味着我必须在项目中添加项目或DLL引用才能编译代码

依赖项注入应该删除组件之间的依赖项。通过代码初始化通过要求项目或DLL引用来重新引入依赖关系。xml配置文件可以引用任何程序集


如果我基于接口创建一个新的实现,我可以通过添加已编译的DLL并更新xml配置文件,将新的实现集成到现有的应用程序中。如果我通过代码进行配置,我必须重新编译应用程序以替换实现。

Duplicate:不是重复的。这个问题涉及如何使用基于代码的组合。我的问题是为什么-折衷/好处是什么。好吧,很公平-我会试着回答。这很好。我本能地喜欢代码,这就是为什么。我们有两个web服务可能需要后期绑定,所以我们只需要几个XML条目。ISV代表“独立软件供应商”。也可以编写一个简单的表单,生成/编辑此类后期绑定配置,至少可以避免用户输入错误。对于特定于客户的实现和其中包含的IP,这是我看到的唯一能够“热插拔”该逻辑并使.dll不在包含的构建周期中的方法删除依赖项不仅仅是删除“dll依赖项”。这是关于关注点和SRP的分离。能够在不编译的情况下更改组件是很好的,但在更大范围内,这远远不是IMO所认为的重要