.Net 애플리케이션에서는 VS가 생성한 프로젝트 프로젝트에 App.config 또는 Web.config와 같은 파일이 포함되는 것을 자주 볼 수 있습니다. 이 파일을 우리는 애플리케이션 구성 파일이라고 부릅니다. 이 파일은 데이터베이스 연결, 인증 모드 등과 같은 애플리케이션과 관련된 일부 정보를 설명합니다. 프로그램에서 ConfigurationManager의 ConnectionStrings 속성을 사용하여 구성 파일의 데이터베이스 연결 문자열 정보를 편리하게 얻을 수 있습니다.
그러나 때로는 기본 구성을 사용하는 대신 이를 확장하고 일부 사용자 정의 요소를 추가해야 할 때도 있습니다. 예를 들어, 클래스를 동적으로 로드하고 프로그램이 시작될 때 초기화해야 할 수 있지만 이 클래스나 초기화 데이터는 프로그램 설계 중에 알려지지 않습니다. 이런 문제는 누구나 겪어본 적이 있을 거라 생각하므로 여기서는 자세히 설명하지 않겠습니다. 가장 좋은 방법은 변경될 수 있는 사항을 구성 파일에 작성하는 것입니다. 확실하다면 제품이 온라인 상태가 되어 변경하려고 할 때 VS를 여는 데 30초가 걸리지 않고 구성 파일만 수정하면 됩니다. 코드.
구성 파일에 일부 사용자 정의 요소를 추가하는 것은 쉽고 다음 두 단계만 수행하면 됩니다.
1. 정의하려는 노드 이름과 해당 노드를 처리하는 데 사용되는 구성 섹션 핸들러를 <configSections> 노드에 등록합니다. 코드는 다음과 같습니다:
1 <configSections>2 <section name="dbFactory" type="DbFactory.Configuration.DbFactorySection,DbFactory.Configuration"/>3 </configSections>
2. 적절한 위치에 사용자 정의 노드를 추가합니다. 코드는 다음과 같습니다:
1 <configSections> 2 <section name="dbFactory" type="DbFactory.Configuration.DbFactorySection,DbFactory.Configuration"/> 3 </configSections> 4 <dbFactory> 5 <default Factory="sql"></default> 6 <factorys> 7 <이름 추가="sql" 어셈블리="Hello.Data" 클래스="SqlDbFactory" /> 8 <이름 추가="oracle" 어셈블리="Hello.Data" 클래스="OracleDbFactory" /> 9 </ 공장>10 </dbFactory>
사용자 정의 노드가 추가되었습니다. 그런데 프로그램에서 이 구성 정보를 어떻게 얻을 수 있습니까? 저는 여러분 중 많은 분이 XML을 다루는 전문가라고 믿습니다. 정말 그렇습니다. 스승님은 정말 존경합니다. 하지만 이런 방식으로 구현되면 실제로 이 블로그 게시물을 작성할 필요가 없습니다.
.Net 프레임워크는 구성 파일에 대한 작업을 단순화하기 위해 많은 구성 API를 구현합니다. 첫 번째 단계에서는 사용자 정의된 노드 정보를 읽고 쓰는 데 사용되는 구성 섹션 핸들러에 대해 언급했습니다. 그렇다면 구성 섹션 핸들러를 어떻게 구현합니까? 먼저, 관련 클래스와 개념을 살펴보겠습니다.
ConfigurationSection: 사용자 정의 노드는 사용자 정의 구성 섹션에 대한 사용자 정의 처리 및 프로그래밍 방식 액세스를 제공하기 위해 이 클래스를 상속해야 합니다.
ConfigurationElement: 구성 파일 내의 요소를 나타냅니다.
ConfigurationElementCollection: 하위 요소 컬렉션을 포함하는 구성 요소를 나타냅니다.
이러한 클래스를 사용하면 구성 파일에 두 가지 유형의 구성 요소가 있음을 요약할 수 있습니다.
첫째, 단일 구성 요소는 ConfigurationElement에서 상속되며 하위 요소를 포함하지 않는 요소입니다.
둘째, 컬렉션 구성 요소는 자식 요소 컬렉션을 포함하는 ConfigurationElementCollection에서 상속된 요소입니다.
개념은 상대적으로 추상적인 경우가 많습니다. 이러한 사항을 이해하려면 위에 제시한 예를 바탕으로 자세히 설명해야 합니다.
<dbFactory> 구성 섹션에는 <default>와 <factorys>라는 두 가지 요소가 있으며, <factorys> 요소에는 두 개의 하위 요소가 포함되어 있습니다. 따라서 여기서 <default>는 단일 구성 요소이고 <factorys>는 컬렉션 구성 요소입니다. 이러한 요소에 각각 해당하는 클래스와 해당 속성을 구현해야 합니다.
<default> 요소: 단일 유형 요소이므로 ConfigurationElement를 상속합니다. 이 요소에는 팩토리 속성이 있으므로 클래스에서 그에 따라 정의합니다. 코드는 다음과 같습니다:
암호
공용 클래스 DefaultElement: ConfigurationElement { [ConfigurationProperty("factory")] 공용 문자열 Factory { get { return this["factory"] as string } set { this["factory"] = value;
참고: 속성 정의 위에 있는 속성의 ConfigurationProperty 특성을 등록해야 합니다.
<factorys> 하위 요소:
암호
public class FactoryElement : ConfigurationElement { [ConfigurationProperty( "name" )] public string Name { get { return this["name"] as string } set { this["name"] = value; )] 공개 문자열 어셈블리 { get { return this["assemblies"] as string; } set { this["assemblies"] = value } } [ConfigurationProperty("class")] public string Class { get { return this[" class"]를 문자열로; } set { this["class"] = value; } } }
<factorys> 요소는 컬렉션 요소이며 ConfigurationElementCollection을 상속합니다.
암호
public class FactoryElements : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new FactoryElement() } protected override 객체 GetElementKey( ConfigurationElement element ) { return ((FactoryElement)element).Name } public FactoryElement this[string name] { get { BaseGet( 이름 )을 FactoryElement로 반환 } } }
ConfigurationElementCollection 클래스는 추상 클래스이므로 CreateNewElement 메서드와 GetElementKey 메서드를 명시적으로 구현해야 합니다.
ConfigurationSection에서 상속된 <dbFactory> 노드
암호
공용 클래스 DbFactorySection: ConfigurationSection { [ConfigurationProperty("default")] public DefaultElement DefaultFactory { get { return this["default"] as DefaultElement; } set { this["default"] = value; )] 공개 FactoryElements Factorys { get { return this["factorys"] as FactoryElements; } set { this["factorys"] = value;
구성 섹션 처리기가 마침내 완료되었습니다. 이 네 가지 클래스를 동일한 프로젝트 디렉터리에 넣고 DLL로 컴파일합니다. 구성 정보를 얻어야 하는 경우 이 DLL을 참조하고 DbFactorySection section = ConfigurationManager.GetSection( "dbFactory" )을 DbFactorySection으로 사용하십시오.