2010-08-05 40 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和其他配置文件進行轉換。