ama*_*eur 7 c# dependency-injection spring.net inversion-of-control
我正在使用spring.net IOC依赖注入为我的asp.net Web应用程序设置我的xml配置文件.我在web.config中引用了每个配置文件.spring.net配置文件(settings.xml)中的设置示例如下:
<object id="obj1"
type="NS.Common.Cache.Class, NS.Common"
singleton="true"
init-method="Initialize"
destroy-method="Dispose">
<property name="Name" value="My Name" />
</object>
Run Code Online (Sandbox Code Playgroud)
一切正常.
现在我在多个环境中安装我的Web应用程序,所以我正在为环境创建一个spring.net配置文件,例如.dev,qa,prod.
因此,在安装应用程序时,web.config中会引用适用的环境spring文件.这是自动安装程序的一部分.
在qa环境文件中,我想将"obj1"上面的对象重新定义为:
<object id="obj1"
type="NS.Common.Cache.Class2, NS.Common"
singleton="true"
init-method="Initialize"
destroy-method="Dispose">
<property name="Name" value="My New Name" />
</object>
Run Code Online (Sandbox Code Playgroud)
但是,由于这是自动的(添加对环境文件的引用),因此不会更改settings.xml文件.
现在引用具有相同id的已定义对象的2个文件 - 这会导致主要问题,因为将发生运行时错误.
是否有任何方法可以包含在qa.xml和flag等中以突出显示此对象定义覆盖具有相同对象ID的任何其他xml文件中的任何其他已定义对象?
您可以加载两个相同的ID,最后一个id将"覆盖"第一个列出的对象(在创建之前,它们必须通过在上下文定义中引用它们而在不同的文件中).
<context ...>
<resource ... /> <!-- put your 3rd-party (read-only config here) -->
<resource ... /> <!-- put your override ids here -->
</context>
Run Code Online (Sandbox Code Playgroud)
由于这种默认行为,最好将您的上下文资源按照以"全局含义"开头的顺序(例如,您想要重用的第三方配置)包含到"本地含义"(将app.config作为最后一个条目).
您可以在您能够控制的配置文件中定义别名,而不是定义具有相同 ID 的对象(正如 Marijin 已经提到的那样,这是不可能的)。
例如你可以有
<object name="ProdObj1" type="NS.Common.Cache.Class, NS.Common" singleton="true">
<property name="Name" value="Prod" />
</object>
Run Code Online (Sandbox Code Playgroud)
和
<object name="TestObj1" type="NS.Common.Cache.Class, NS.Common" singleton="true">
<property name="Name" value="Test" />
</object>
Run Code Online (Sandbox Code Playgroud)
然后使用
<alias name="ProdObj1" alias="obj1"/>
Run Code Online (Sandbox Code Playgroud)
例如,在您的 web.config 中。
| 归档时间: |
|
| 查看次数: |
2146 次 |
| 最近记录: |