반응형
첫 번째로 본고에서는 C#을 사용하여 유연한 구성 섹션 핸들러를 작성하는 방법을 설명하겠습니다.NET 개발자라면 구성 섹션 핸들러를 기술한 경험이 여러 번 있을 것입니다.먼저 .NET 구성 시스템의 배경을 간단히 소개하고, 이 시스템이 유익한 이유와 이 시스템을 확장하는 방법에 대해 설명합니다.구성 시스템의 배경과 개념 .NET 구성 시스템의 목적은 단순하며, 구성 정보를 읽고 쓰기 위한 일관된 방법을 개발자에게 제공하는 것입니다.과거 XML 개발자들은 일반적으로는 초기설정 파일(.ini), 데이터베이스 또는 자체 구성 형식을 사용했습니다.현재의 개발자는 구성 인터페이스를 실장하고, 거기에 따라 구성 핸들러를 기술하는 것만으로 끝납니다. .NET 구성 시스템에는 .NET 구성 설정에 프로그램적으로 액세스하기 위한 클래스가 몇 개 준비되어 있습니다.System.Configuration.ConfigurationSettings는 개발자가 구성 파일에 액세스하기 위한 클래스입니다.이 클래스의 인터페이스는 매우 단순합니다.AppSettings 속성은 구성 섹션을 공개하므로 개발자는 키/값 형식을 통해 설정을 얻을 수 있습니다.이 클래스에는 Get Config(section Name)이라고 하는 메서드도 포함되어 있습니다.개발자는 이 메서드를 사용하여 특정 섹션의 구성 설정을 요구할 수 있습니다.또한 구성 프레임워크를 사용하여 자체 구성 섹션과 핸들러를 작성할 수도 있습니다.구성 설정은 System.Configuration.IConfigurationSectionHandler 인터페이스를 구현하고 있는 섹션 핸들러로 작성됩니다.이 인터페이스는 Create 메서드를 공개하고 있습니다.개발자는 이 Create 메서드를 이용하여 특정 섹션의 XML만 설정 객체로 변환할 수 있습니다.이 메서드에 의해 개발자는 구성파일의 소재, 구성파일 내에서의 특정 섹션의 해석, 파일의 오픈/클로즈와 같은 상세를 신경쓰지 않아도 됩니다.Create 메서드에서 반환된 오브젝트는 적절한 설정 오브젝트로 변환 또는 캐스트할 수 있습니다.구성 섹션 핸들러의 작성 개발을 실시하고 있으면 실행 시에 구성 시스템으로부터 값을 취득해야 하는 상황에 종종 발생합니다.제 소속팀이 최근에 만든 몇몇 웹 어플리케이션은 모든 페이지를 한 클래스에서 상속을 받아 만드는 방식을 취하고 있었습니다.이 클래스내에서는, 인증(authentication), 허가(authorization), 페이지 레이아웃을 취급하고 있었습니다.각각의 어플리케이션의 외형은 CSS로 바꿨습니다만, 사용하고 있는 HTML 코드는 같았습니다.우리는 이 구조를 실현하기 위해서 스타일시트를 관련지은 객체를 몇 개 작성하고, 그것을 이용하여 페이지에 짜넣을 스타일시트를 동적으로 설정하였습니다.본 글에서는 이 예를 사용해서 구성 핸들러의 다양한 이용 방법을 구체적으로 설명해 보겠습니다.개요기본 페이지 클래스에서는 페이지에 들어갈 스타일 시트를 구성 파일로 변경할 수 있도록 해야겠다고 생각했습니다.이를 구현하는 수단으로 StyleSheet 클래스, StyleSheet Collection 클래스, StyleSheet Setting 클래스를 만들었습니다.StyleSheet클래스에는 Name, Href, Media라고 하는 3개의 단순한 문자열 속성을 준비를 했습니다.StyleSheet Collection 클래스는 Collection Base에서 상속을 받아 작성하여 StyleSheet 오브젝트들을 익숙한 방식으로 저장할 수 있도록 했습니다.StyleSheetSetting클래스에는 StyleSheets라고 하는 StyleSheet Collection형 속성을 준비했습니다.StyleSheet Setting 클래스는 구성 파일 내의 섹션을 나타내는 객체 표현입니다.섹션 핸들러의 실행 대부분의 개발자는 구성 섹션 핸들러를 특정 구성 섹션별로 따로 기술하려고 생각합니다(저도 그랬습니다).그러나 IConfiguration Section Handler 인터페이스의 구현 패턴을 한 번 이해해 버리면 핸들러의 작성은 상투적인 지루한 작업이 됩니다.여기에서는 구성 섹션 핸들러의 기본적인 작성 방법을 구체적으로 제시합니다.리스트1은 이번 샘플 구성 파일의 소스코드입니다.간결하게 하기 위해 이 외의 구성 섹션은 생략되어 있습니다.이 구성 파일에 StyleSheetSettings_1이라고 하는 섹션을 작성하고 거기에 Basic Configurator라고 하는 형을 할당을 하고 있습니다.이를 통해 System.Configuration.ConfigurationSettings.GetConfig(′StyleSheetSettings_1′)가 호출되면 언제든지 BasicConfigurator.Create 메서드를 실행하도록 .NET 구성 시스템에 지시하고 있습니다.리스트1
< ? xmlversion = ′ 1 . 0 ′ encoding = ′ utf - 8 ′ ? >
< configuration >
< configSections >
< sectionname = ′ StyleSheetSettings _ 1 ′
type = ′ FifteenSeconds . Core . BasicConfigurator , FifteenSeconds . Core ′ / >
< / configSections >
< StyleSheetSettings _ 1 >
< StyleSheets >
< StyleSheetName = ′ Page ′ Href = ′ Styles / Page . css ′ Media = ′ screen ′ / >
< StyleSheetName = ′ Custom ′ Href = ′ Styles / Custom . css ′ Media = ′ screen ′ / >
< StyleSheetName = ′ Print ′ Href = ′ / Lib / Styles / Print . css ′ Media = ′ print ′ / >
< / StyleSheets >
< / StyleSheetSettings _ 1 >
Basic Configuration 핸들러내에 Create 메서드를 실장합니다.이 메서드의 소스 코드를 리스트 2에 나타냅니다.이 메서드는 StyleSheetSettings_1 구성 섹션을 다루는 방법을 .NET 구성 시스템에 알려주기 위한 것입니다.먼저 StyleSheetSetting_1개체를 생성을 하겠습니다.이것이 이 메서드가 반환하는 설정 객체가 되겠습니다.그 다음 Xml Node List를 만들고 XPath 쿼리를 사용하여 섹션 내의 모든 노드를 선택합니다.이 목록 안에 모든 노드를 반복 처리를 하고 지원하는 StyleSheet 오브젝트를 만듭니다.이 오브젝트의 속성을 섹션 XML안의 속성에 따라 할당합니다.그 후에 이 StyleSheet 오브젝트들을 설정 클래스의 StyleSheet Collection형의 StyleSheets속성에 추가를 하겠습니다.이 방법으로도 문제가 없을 것이고, 대부분의 개발자들은 이 방법으로 만족할 것입니다.이 방법에서는 개발자가 섹션별로 또는 자체적으로 작성한 오브젝트 모델별로 새로운 구성 섹션 핸들러를 작성해야 합니다.다음 예제에서는 어떤 종류의 객체 모델에 대해서도 재사용할 수 있는 구성 섹션 핸들러를 기술하는 방법을 소개합니다.리스트 2
public object Create ( object parent , object configContext , System . Xml . XmlNode section )
{
StyleSheetSettings _ 1 settings = null ;
if ( section == null ) { return settings ; }
settings = new StyleSheetSettings _ 1 ( ) ;
XmlNodeList styleSheets = section . SelectNodes ( @ ′ / StyleSheets / StyleSheet ′ ) ;
for ( int i = 0 ; i < styleSheets . Count ; i++ )
{
XmlNode node = styleSheets . Item ( i ) ;
StyleSheet styleSheet = new StyleSheet ( ) ;
styleSheet . Name = node . Attributes [ ′ Name ′ ] . InnerText ;
styleSheet . Href = node . Attributes [ ′ Href ′ ] . InnerText ;
styleSheet . Media = node . Attributes [ ′ Media ′ ] . InnerText ;
settings . StyleSheets . Add ( styleSheet ) ;
}
return settings ;
}} Xml SerialzerConfiguration 섹션 핸들러 우리는 웹 어플리케이션을 개발하는 과정에서 몇 개의 구성 섹션 핸들러를 기술했습니다.게다가 구성 파일내의 개개의 섹션에 대해서 핸들러를 쓰지 않아도 되도록 하기 위해서, 이러한 핸들러를 추상화하는 방법을 연구했습니다.그 중에서 우연히, Craig Andera의 훌륭한 기사(링크 끊김)를 발견했습니다.Craig 기사에서는 Xml Serialization을 사용하여 이 문제를 해결할 수 있는 방법이 소개되었습니다.리스트 3은, 그 기사에서 취급하고 있던 구성 파일의 코드 발췌입니다.리스트 4는 Craig가 쓴 소스 코드입니다.リスト3
<구성>
<구성 섹션>
= 섹션 이름=′스타일시트 설정_1′
=′15초′를 입력합니다.Core.XmlConfigurator, 15초.코어′/>
//configSectionsections
style 스타일시트 설정_1
구성자=′15초′를 입력합니다.Core.StyleSheetSettings_1, 15Seconds입니다.코어′ >
<스타일시트>
= 스타일시트 이름=′페이지′ Href=′/Lib/Styles/Page.css′ 미디어=′스크린′/′
= 스타일시트 이름′사용자 정의′ Href=′/Lib/Styles/Custom.css′ Media=′screen′/>
= 스타일시트 이름′인쇄′ Href=′/Lib/Styles/Print.css′ 용지=′인쇄′/>
스타일시트>
스타일시트 설정_1>4인 경우
public object 생성(개체 상위, 개체 configContext, 시스템)Xml.XmlNode 섹션)
{
개체 설정 = null;
if(섹션 == null) { 설정 반환; }
XPath Navigator 탐색기 = 섹션.네비게이터 만들기();
문자열 유형 이름 =(문자열)이(가) 잘못되었습니다.평가(′문자열(@configuratorType));
유형 섹션유형 = 유형.GetType(유형 이름);
XmlSerializer xs = 새 XmlSerializer(sectionType);
XmlNodeReader = 새 XmlNodeReader(섹션);
설정 = xs.역직렬화(판독기);
반환 설정;
}構成ファイルのコードが前述の例とよく似ていることに気付くでしょう。唯一の違いはセクションにあります。この例では、configuratortypeという属性が追加されています。これにより、xmlconfiguratorは作成する設定オブジェクトの型を実行時に判断できるようになります。xmlconfigurator.createメソッドには、xmlを適切な設定オブジェクトにデシリアライズするコードが含まれています。このメソッドは、まずxmlnodeセクションからxpathnavigatorを作成します。次に、navigatorオブジェクトに対してevaluateメソgettype静的メソッドを使用して、その型への参照を作成します。次にxmlserializerを作成しますが、このとき、コンストラクタにセクションの設定の型を渡します。その後、セクションxmlから作成したxmlnodereaderをdeserializeメソッドに渡します。このメソッドは、作成しようとする設定オブジェクトに対応するオブジェクトを返します。craigのコードには含まれていませんが、craigの記事では、xmlのserialization属性を使用して設定
[XmlAttribute(DataType=′string′, AttributeName=′Name′)
공용 문자열 이름
{
{return_Name;을(를) 가져옵니다.}
{_Name = 값 설정;}
}
[Xml 속성()]
공용 문자열 Href
{
{return_Href;} 가져오기
집합 {_Href = 값;}
}上記のコードでは、プロパティを修飾する2とおりの手法を紹介しています。1つ目の例では、属性の中でdatatypeプロパティとattributenameプロパティを明示的に割り当てています。これらのプロパティを省略するこsecurityという3つの文字列プロパティを持つdataconnectionクラスを作成しました。パブリックプロパティステートメントではxmlattributeを省略しました。これにより、各プロパティを構成ファイル内の要素として入力すること
=DataAccessSettingstype=′15초.Core.DataAccessSettings, 15Seconds.코어′ >
<연결>
<서버>(로컬);서버>
<데이터베이스>15초;데이터베이스>
<보안>통합 보안=SSPI;보안>
연결>
これが、connectionプロパティを持つ設定オブジェクトになります。まとめ本稿では、.net構成システムの利便性を具体的に紹介しました。.netのxmlserialization機能を利用すると、コードを効率的に再使用することができます。craig anderaも述べていたとおり、構成セクションハンドラを記述するのは一度きりにしたいものです。本稿のサンプルコードには、独
< ? xmlversion = ′ 1 . 0 ′ encoding = ′ utf - 8 ′ ? >
< configuration >
< configSections >
< sectionname = ′ StyleSheetSettings _ 1 ′
type = ′ FifteenSeconds . Core . BasicConfigurator , FifteenSeconds . Core ′ / >
< / configSections >
< StyleSheetSettings _ 1 >
< StyleSheets >
< StyleSheetName = ′ Page ′ Href = ′ Styles / Page . css ′ Media = ′ screen ′ / >
< StyleSheetName = ′ Custom ′ Href = ′ Styles / Custom . css ′ Media = ′ screen ′ / >
< StyleSheetName = ′ Print ′ Href = ′ / Lib / Styles / Print . css ′ Media = ′ print ′ / >
< / StyleSheets >
< / StyleSheetSettings _ 1 >
Basic Configuration 핸들러내에 Create 메서드를 실장합니다.이 메서드의 소스 코드를 리스트 2에 나타냅니다.이 메서드는 StyleSheetSettings_1 구성 섹션을 다루는 방법을 .NET 구성 시스템에 알려주기 위한 것입니다.먼저 StyleSheetSetting_1개체를 생성을 하겠습니다.이것이 이 메서드가 반환하는 설정 객체가 되겠습니다.그 다음 Xml Node List를 만들고 XPath 쿼리를 사용하여 섹션 내의 모든
public object Create ( object parent , object configContext , System . Xml . XmlNode section )
{
StyleSheetSettings _ 1 settings = null ;
if ( section == null ) { return settings ; }
settings = new StyleSheetSettings _ 1 ( ) ;
XmlNodeList styleSheets = section . SelectNodes ( @ ′ / StyleSheets / StyleSheet ′ ) ;
for ( int i = 0 ; i < styleSheets . Count ; i++ )
{
XmlNode node = styleSheets . Item ( i ) ;
StyleSheet styleSheet = new StyleSheet ( ) ;
styleSheet . Name = node . Attributes [ ′ Name ′ ] . InnerText ;
styleSheet . Href = node . Attributes [ ′ Href ′ ] . InnerText ;
styleSheet . Media = node . Attributes [ ′ Media ′ ] . InnerText ;
settings . StyleSheets . Add ( styleSheet ) ;
}
return settings ;
}} Xml SerialzerConfiguration 섹션 핸들러 우리는 웹 어플리케이션을 개발하는 과정에서 몇 개의 구성 섹션 핸들러를 기술했습니다.게다가 구성 파일내의 개개의 섹션에 대해서 핸들러를 쓰지 않아도 되도록 하기 위해서, 이러한 핸들러를 추상화하는 방법을 연구했습니다.그 중에서 우연히, Craig Andera의 훌륭한 기사(링크 끊김)를 발견했습니다.Craig 기사에서는 Xml Serialization을 사용하여 이 문제를 해결할 수 있는 방법이 소개되었습니다.리스트 3은, 그 기사에서 취급하고 있던 구성 파일의 코드 발췌입니다.리스트 4는 Craig가 쓴 소스 코드입니다.リスト3
<구성>
<구성 섹션>
= 섹션 이름=′스타일시트 설정_1′
=′15초′를 입력합니다.Core.XmlConfigurator, 15초.코어′/>
//configSectionsections
style 스타일시트 설정_1
구성자=′15초′를 입력합니다.Core.StyleSheetSettings_1, 15Seconds입니다.코어′ >
<스타일시트>
= 스타일시트 이름=′페이지′ Href=′/Lib/Styles/Page.css′ 미디어=′스크린′/′
= 스타일시트 이름′사용자 정의′ Href=′/Lib/Styles/Custom.css′ Media=′screen′/>
= 스타일시트 이름′인쇄′ Href=′/Lib/Styles/Print.css′ 용지=′인쇄′/>
스타일시트>
스타일시트 설정_1>4인 경우
public object 생성(개체 상위, 개체 configContext, 시스템)Xml.XmlNode 섹션)
{
개체 설정 = null;
if(섹션 == null) { 설정 반환; }
XPath Navigator 탐색기 = 섹션.네비게이터 만들기();
문자열 유형 이름 =(문자열)이(가) 잘못되었습니다.평가(′문자열(@configuratorType));
유형 섹션유형 = 유형.GetType(유형 이름);
XmlSerializer xs = 새 XmlSerializer(sectionType);
XmlNodeReader = 새 XmlNodeReader(섹션);
설정 = xs.역직렬화(판독기);
반환 설정;
}構成ファイルのコードが前述の例とよく似ていることに気付くでしょう。唯一の違いはセクションにあります。この例では、configuratortypeという属性が追加されています。これにより、xmlconfiguratorは作成する設定オブジェクトの型を実行時に判断できるようになります。xmlconfigurator.createメソッドには、xmlを適切な設定オブジェクトにデシリアライズするコードが含まれています。このメソッドは、まずxmlnodeセクションからxpathnavigatorを作成します。次に、navigatorオブジェクトに対してevaluateメソgettype静的メソッドを使用して、その型への参照を作成します。次にxmlserializerを作成しますが、このとき、コンストラクタにセクションの設定の型を渡します。その後、セクションxmlから作成したxmlnodereaderをdeserializeメソッドに渡します。このメソッドは、作成しようとする設定オブジェクトに対応するオブジェクトを返します。craigのコードには含まれていませんが、craigの記事では、xmlのserialization属性を使用して設定
[XmlAttribute(DataType=′string′, AttributeName=′Name′)
공용 문자열 이름
{
{return_Name;을(를) 가져옵니다.}
{_Name = 값 설정;}
}
[Xml 속성()]
공용 문자열 Href
{
{return_Href;} 가져오기
집합 {_Href = 값;}
}上記のコードでは、プロパティを修飾する2とおりの手法を紹介しています。1つ目の例では、属性の中でdatatypeプロパティとattributenameプロパティを明示的に割り当てています。これらのプロパティを省略するこsecurityという3つの文字列プロパティを持つdataconnectionクラスを作成しました。パブリックプロパティステートメントではxmlattributeを省略しました。これにより、各プロパティを構成ファイル内の要素として入力すること
=DataAccessSettingstype=′15초.Core.DataAccessSettings, 15Seconds.코어′ >
<연결>
<서버>(로컬);서버>
<데이터베이스>15초;데이터베이스>
<보안>통합 보안=SSPI;보안>
연결>
これが、connectionプロパティを持つ設定オブジェクトになります。まとめ本稿では、.net構成システムの利便性を具体的に紹介しました。.netのxmlserialization機能を利用すると、コードを効率的に再使用することができます。craig anderaも述べていたとおり、構成セクションハンドラを記述するのは一度きりにしたいものです。本稿のサンプルコードには、独
반응형