我想在web.config中定义一个变量,我可以在web.config文件(以及其他配置文件)中的多个位置使用。通过示例解释可能更容易......
的web.config
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="AuthServiceEndPoint" value="any_old_name_i_like"/>
</appSettings>
<system.web>
...
<system.serviceModel>
<client>
<endpoint
address="net.tcp://localhost/AuthService"
binding="netTcpBinding"
contract="MyServices.Contracts.IAuthService"
name="#{AppSettings.AuthServiceEndPoint}"
bindingConfiguration="netTcpBindingConfig"
/>
</client>
</system.serviceModel>
</configuration>
windsor.config
<?xml version="1.0" encoding="utf-8" ?>
<castle>
<components>
...
<component
id="AuthProvider"
service="MyServices.Client.IAuthProvider, MyServices.Client"
type="MyServices.Client.AuthProvider, MyServices.Client"
lifestyle="transient">
<parameters>
<endpoint>#{AppSettings.AuthServiceEndPoint}</endpoint>
</parameters>
</component>
</components>
</castle>
这可能吗?
修改(更多信息)
我已经能够从windsor.config文件访问AppSettings(实际上是由city windsor和自定义XmlInterpreter处理的。
真正的问题是我可以在web.config中执行此操作吗?
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="AuthServiceEndPoint" value="any_old_name_i_like"/>
</appSettings>
<system.web>
...
<system.serviceModel>
<client>
<endpoint
address="net.tcp://localhost/AuthService"
binding="netTcpBinding"
contract="MyServices.Contracts.IAuthService"
name="#{AppSettings.AuthServiceEndPoint}"
bindingConfiguration="netTcpBindingConfig"
/>
</client>
</system.serviceModel>
</configuration>
即 - 从我的web.config文件的其他部分访问<appSettings>
中的变量。
答案 0 :(得分:0)
不是我能想到的。您可以在global.asax.cs中使用C#而不是xml文件进行配置。
或者,让构建过程编辑的web.config替换所有这些值。 FinalBuilder有一个neato“编辑XML文件”操作,它使用XPath做得很好,而FinalBuilder 确实有变量。问题解决了。这就是我在工作中构建的方法。
答案 1 :(得分:0)
离开我的头顶,我想知道你是否可以用T4做到这一点?我想也许你可以定义一个解析Web-Template.config并输出Web.config的模板?当然,这仅适用于单个文件。
答案 2 :(得分:0)
您可以使用NAnt或MSBuild。您确实需要单独的配置文件,但是在构建项目时,它们可以自动对Web.config和其他配置文件进行转换。
答案 3 :(得分:0)
我再次回答我自己的问题:-S
我通过编写NetTcpServiceLocator来解决这个问题......
public interface INetTcpServiceLocator
{
EndpointAddress GetAddress(Type serviceType);
}
...以及自定义配置节处理程序,它还实现了上述接口并读入以下配置节...
<services>
<service contract="My.Services.TestService.Contracts.ITestService" address="net.tcp://localhost/TestService" />
</services>
然后我为每个服务创建了一个代理......
public class TestServiceProxy : ITestService
{
public SomeInformation GetSomeInformation(SomeParams @params)
{
using (var factory = new NetTcpServiceFactory<ITestService>())
{
var service = factory.Service;
return service.GetSomeInformation(@params);
}
}
}
我的控制器依赖于服务,该服务依赖于ITestService。所有这些都与Castle Windsor和使用属性依赖注入相结合。
因此,我的控制器调用它的服务,后者又调用ITestService(在这种情况下是一个代理,它从自定义部分处理程序获取它的端点)。
自定义部分处理程序(也是INetTcpServiceLocator)具有“perWebRequest”的windsor生活方式,因此它被框架调用,web.config被读入内存中的数组。调用服务代理时,它只会根据合同类型提取相关端点。
这都是由合同类型驱动的,所以不再需要web.config中的任何变量。
我已经选择了基于代码的解决方案,因为我没有在本地使用构建过程,只有当我将代码提交给subversion时,构建过程才会在构建服务器上启动。