2010-08-05 42 views
4

我想在我的web.config中定义一个变量,我可以在我的web.config文件(和其他配置文件)中的多个位置使用该变量。它可能更容易通过例子来解释......在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文件(实际上是由温莎城堡和一个自定义XmlInterpreter处理访问的AppSettings的能力。

真正的问题是我能做到这一点在我的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> 

即 - 以m访问变量从我的web.config文件的其他部分输入y <appSettings>

+0

两个配置文件都在同一个目录下吗?请记住,web.config文件是分层文件,因此在根文件web.config中定义的appsettings也可以在子文件夹中的web.config文件中使用。但是,这可能不符合您的要求。 – Manfred 2010-08-05 09:45:58

+0

@John,对不起,我错过了一些关键信息,现在我会更新我的问题。 – 2010-08-05 09:48:23

+0

我删除了我的答案,因为它不再与编辑中提供的额外信息相关。 – 2010-08-05 09:56:10

回答

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时,构建过程才会启动构建服务器。

+1

这解决了您的问题,但并未真正回答标题中的问题:在web.config中使用web.config变量。我从你的回答中收集到真正的答案是否定的。 – johnnywhoop 2012-07-26 16:19:02

+0

正确,答案是否定的。所以我们只需要找到解决方法:) – 2012-07-26 21:22:55

0

不是我能想到的。你可以在C#中使用global.asax.cs而不是xml文件进行配置。

或者,让您的构建过程编辑您的web.config以替换所有这些值。 FinalBuilder有一个neato“编辑XML文件”操作,它使用XPath很好地执行此操作,并且FinalBuilder 确实有有变量。问题解决了。这就是我在工作中做我的构建的方式。

0

关闭我的头顶,不知您是否可以用T4做到这一点?我在想,也许你可以定义一个解析Web-Template.config并输出Web.config的模板?当然,这只适用于单个文件。

0

您可以使用NAnt或MSBuild。你确实需要两个独立的配置文件,但是当你建立你的项目时,他们可以自动对你的Web.config和其他配置文件进行转换。