2012-11-20 3 views
2

ASP.Net MVC 응용 프로그램을 만들 때 두 번이나 질문을받습니다. 여러 고객에게 배포 할 응용 프로그램이 한 개 있다고 가정 해보십시오. 응용 프로그램 코드는 동일하지만 각 고객에 대해 하나의 appSettings.config 파일을 가질 수 있기 때문에 web.config에서 appSettings 태그의 configSource를 변경하여 다른 고객에게 배포 할 수 있습니다 , 여전히).계층 구조의 여러 AppSettings.config 파일

그런 다음 appSettings.config의 콘텐츠 중 50 %는 모든 고객에게 공통적이며 50 % 만 고객에게 종속된다는 것을 알고 있습니다. 결국 모든 appSettings 파일에 중복 된 항목이 생길 수 있습니다. 이는 구성에 대한 응용 프로그램 차원의 변경을 원한다면 모든 항목을 업데이트해야한다는 점에서 중요한 함정입니다.

이와 같은 경우에는 "기본 구성"과 "고객 구성"을 별도의 파일로 가질 수있는 일종의 계층 적 시스템을 갖고 싶습니다. 그런 다음 ConfigurationManager에서 먼저 고객 구성의 값을 확인하고, 정의되지 않은 경우에는 기본 구성으로 이동합니다.

ASP.Net MVC4의 기본 기능을 사용하여 직접 해결할 수있는 방법을 찾지 못했습니다. 종료 되었습니까? 아니면 기본 ConfigurationManager 클래스 주위에서 어떻게 든 작동해야합니까? 내 자신의 클래스를 만들고 잠재적으로 내 자신의 구현에 대한 호출로 ConfigurationManager.AppSettings [key]에 대한 모든 호출을 바꿀 수는 있지만 가능하면 그렇게하지 않을 것입니다. 기본 제공되는 ConfigurationManager에서 캐싱 등의 기본 기능을 사용할 수 있기를 원합니다.

앞서 이와 비슷한 문제를 해결 한 사람은 누구입니까? 나는 그것이 일반적인 시나리오처럼 생각하고있다.

답변

5

그것은 일반적인 시나리오이며 그것을 해결하는 다른 방법이있다. 한 가지 방법은 config transforms을 사용하는 것입니다. 당신은 Web.Debug.configWeb.Release.config을 가지고있는 것처럼 Web.Customer1.config, Web.Customer2.config 등을 가질 수 있습니다. 고객 전용 변환 파일에서 고객이 사용자 정의하고자하는 appSettings 만 "대체"할 수 있습니다.

다른 변형을 만들려면 먼저 다른 프로젝트 플랫폼을 만듭니다. Visual Studio 구성 관리자 및 웹 프로젝트 (또는 사용자 지정된 구성 설정이 필요한 프로젝트)의 Configuration 열로 이동하여 드롭 다운을 클릭 한 다음 <New...>을 클릭합니다. 새 프로젝트 구성 이름을 Customer1 또는 원하는대로 지정하고 Copy settings from 상자를 체크하고 해당 드롭 다운에서 Release을 선택하십시오. Create new solution configurations 체크 박스를 선택합니다.

마지막으로 web.config 파일을 마우스 오른쪽 버튼으로 클릭하고 Add config transform을 클릭하십시오. 템플릿 Web.Customer1.config이 생성됩니다. xdt: 구성 변환 속성을 사용하여 필요에 따라 appSettings을 무시하도록 편집하십시오. 그런 다음 Customer1 솔루션 빌드 구성을 사용하여 프로젝트를 게시 할 수 있습니다. 빌드의 일부로 web.config이 변형되어 각 고객마다 다른 web.config 파일로 끝납니다. 이 기능을 사용하여 다른 배치 (예 : db 연결 문자열, smtp 서버, XML 구성 파일의 문자 그대로 변경)에 맞게 프로젝트를 사용자 정의 할 수도 있습니다.

마지막으로 각 Web.Xyx.config 파일을 마우스 오른쪽 단추로 클릭하고 속성을 선택한 다음 Build ActionNone으로 설정하십시오.

예 :

베이스의 Web.config

<appSettings> 
    <add key="CommonProperty1" value="[for all customers]" /> 
    <add key="CommonProperty2" value="[for all customers]" /> 
    <add key="CommonProperty3" value="[for all customers]" /> 
    <add key="CustomProperty1" value="[for one customer]" /> 
    <add key="CustomProperty2" value="[for one customer]" /> 
    <add key="CustomProperty3" value="[for one customer]" /> 
<appSettings> 

web.Customer1.config

<appSettings> 
    <add key="CustomProperty1" value="The Ohio State University" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" /> 
    <add key="CustomProperty2" value="Scarlet" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" /> 
    <add key="CustomProperty3" value="Gray" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" /> 
<appSettings> 

web.Customer2.config

<appSettings> 
    <add key="CustomProperty1" value="Michigan University" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" /> 
    <add key="CustomProperty2" value="Blue" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" /> 
    <add key="CustomProperty3" value="Maize" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" /> 
<appSettings> 
관련 문제