오늘은 저번에 다룬  내용을 조금 더 심화시켜 보려한다.
음 저번에 다룬 내용은 nested element  를 선언하고 사용하는 방법이었는데 저번에 다룬 nested element 는 단순히 하나의 instance로 제한되어 있었고 코드로 정의된 element 내에서 나타내야만 했다.
이런 element를 Collection 형태로 하거나 element list 로 구성하는 것은 약간은 다른 접근이 필요하다.

이번에도 저번과 마찬가지로 기존에 만들어 오던 소스에 덫붙여 나가도록 하겠다. ^^

먼저 Configuration file 내에 Element를 Collection  혹은 List 형태로 구성하기 위해서는 ConfigurationElementCollection Class 로 부터 상속을 받아야만 한다.

Configuration File 의 <appSettings> Configuration Section을 사용하던 개발자는 Add/Remove/Cear - 짧게는 ARC Map 에 익숙할 터인데 이 ARC Map 은 ASP.NET Web.config 에서 지원되는 Cascading Collection 이다.
ASP.NET 의 경우 하위 Folder Path 의 Web.Config 의 configuration 내용이 상위 폴더의 config 내용에 Add/Remove/Clear 되어 적용된다.

이런 ARC Map 가 기본적인 Type 으로 이와 같은 Configuration을 구성해보려한다.

Configuration 의 내용을 보면 다음과 같다.


    1 Imports System.Configuration

    2 

    3 Public Class AddressElement

    4   Inherits ConfigurationElement

    5 

    6   Shared _properties As ConfigurationPropertyCollection

    7 

    8   Shared _propertyName As ConfigurationProperty

    9   Shared _propertyPhone As ConfigurationProperty

   10   Shared _propertyEmail As ConfigurationProperty

   11 

   12   Shared Sub New()

   13     _propertyName = New ConfigurationProperty("name", GetType(String), Nothing, ConfigurationPropertyOptions.IsRequired)

   14     _propertyPhone = New ConfigurationProperty("phone", GetType(String), Nothing, ConfigurationPropertyOptions.None)

   15     _propertyEmail = New ConfigurationProperty("email", GetType(String), Nothing, ConfigurationPropertyOptions.None)

   16 

   17     _properties = New ConfigurationPropertyCollection()

   18     _properties.Add(_propertyName)

   19     _properties.Add(_propertyPhone)

   20     _properties.Add(_propertyEmail)

   21   End Sub

   22 

   23 End Class


일단 졸음이 몰려오는 관계루다가... 요까이 먼저 하고...
내일 나머지를 올리는 게 좋을 듯하다... ^^ 죄송.


행복한 고수되셔요...

woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\












저작자 표시 비영리 변경 금지
신고
Posted by woojja

지난 번까지 간단히 사용자 configuration 을 구성하고 접근하는 것에 대해서 구현해 보았다.
이번부터는 조금씩 복잡한 사용자 Configuration 을 구성하는 것을 구현해 보고자 한다.
그렇다고 구현까지 복잡한 것은 아닐테니.. ㅋㅋ

기본저으로 사용자 Configuration Section 안에 정의된 모든 Configuration 은 전부 그런것은 아니지만 .config 파일 내에 Attribute 로 표현될 것이다.
그리고 elecment 와 attribute 를 사용하여 좀더 복잡한 XML 구조의 Configuration 을 구성할 수 있다.

이제부터 이전에 만들었던 Configuration Section 내에 Element 를 포함 시킬것이고 그 Elecment 내에 다시 Attribute 들을 포함시켜 Custom Configuration 을 구성할 것이다.

Custom Configuration Element  는 간단하게 ConfigurationElement Class 를 상속하기만 하면 만들 수 있다.

구현자체는 Custom Configuratoin Element 가 Custom Configuration Section 내에 포함되는 것 이외에는 Custom Configuration Section 을 구현할때와 많이 다르지 않다.

구성할 Configuration 의 내용을 보면 아래 그림과 같다.
먼저 woojjaConfigurationElement Class 를 추가하고 ConfigurationElement 로부터 상속을 받는다.

    1 Imports System.Configuration

    2 

    3 Public Class woojjaConfigurationElement

    4   Inherits ConfigurationElement

    5 

    6   Private Shared woojjaElementProperties As ConfigurationPropertyCollection

    7 

    8   Private Shared phoneProperty As ConfigurationProperty

    9   Private Shared emailProperty As ConfigurationProperty

   10 

   11 #Region "생성자"

   12   Shared Sub woojjaConfigurationElement()

   13     phoneProperty = New ConfigurationProperty("phoneValue", GetType(String), String.Empty, ConfigurationPropertyOptions.IsRequired)

   14     emailProperty = New ConfigurationProperty("emailValue", GetType(String), String.Empty, ConfigurationPropertyOptions.None)

   15 

   16     woojjaElementProperties = New ConfigurationPropertyCollection()

   17     woojjaElementProperties.Add(phoneProperty)

   18     woojjaElementProperties.Add(emailProperty)

   19 

   20   End Sub

   21 #End Region

   22 

   23 #Region "Properties"

   24   <ConfigurationProperty("phone")> _

   25   Public ReadOnly Property PhoneValue() As String

   26     Get

   27       Return CStr(MyBase.Item("phone"))

   28     End Get

   29   End Property

   30 

   31   <ConfigurationProperty("email")> _

   32   Public ReadOnly Property EmailValue() As String

   33     Get

   34       Return CStr(MyBase.Item("email"))

   35     End Get

   36   End Property

   37 #End Region

   38 End Class


위와 같이 Element 를 추가한 후에 이전에 만들었던 Section Class 내에 Element 로 추가되어야 하기 때문에 Property 로 추가해 주어야 한다.
아래와 같이 WoojjaConfigurationSection Class 를 수정해 준다.

    1 Imports System

    2 Imports System.Configuration

    3 

    4 Public Class WoojjaConfigurationSection

    5   Inherits ConfigurationSection

    6 

    7   Private Shared woojjaProperties As ConfigurationPropertyCollection

    8 

    9   Private Shared nameProperty As ConfigurationProperty

   10   Private Shared isManProperty As ConfigurationProperty

   11   Private Shared birthdayProperty As ConfigurationProperty

   12   Private Shared woojjaElement As ConfigurationProperty '====> 추가

   13 

   14 #Region "생성자"

   15   Shared Sub WoojjaConfigurationSection()

   16     nameProperty = New ConfigurationProperty("nameValue", GetType(String), String.Empty, ConfigurationPropertyOptions.IsRequired)

   17     isManProperty = New ConfigurationProperty("isManValue", GetType(Boolean), False, ConfigurationPropertyOptions.None)

   18     birthdayProperty = New ConfigurationProperty("birthdayValue", GetType(Date), Nothing, ConfigurationPropertyOptions.None)

   19     woojjaElement = New ConfigurationProperty("woojjaElement", GetType(woojjaConfigurationElement), Nothing, ConfigurationPropertyOptions.IsRequired) '====>추가

   20 

   21     woojjaProperties = New ConfigurationPropertyCollection()

   22     woojjaProperties.Add(nameProperty)

   23     woojjaProperties.Add(isManProperty)

   24     woojjaProperties.Add(birthdayProperty)

   25     woojjaProperties.Add(woojjaElement) '====>추가

   26 

   27   End Sub

   28 #End Region

   29 

   30 #Region "Properties"

   31   <ConfigurationProperty("nameValue", isrequired:=True)> _

   32   Public ReadOnly Property NameValue() As String

   33     Get

   34       Return CStr(MyBase.Item("nameValue"))

   35     End Get

   36   End Property

   37 

   38   <ConfigurationProperty("isManValue")> _

   39   Public ReadOnly Property isManValue() As Boolean

   40     Get

   41       Return CBool(MyBase.Item("isManValue"))

   42     End Get

   43   End Property

   44 

   45   <ConfigurationProperty("birthdayValue")> _

   46   Public ReadOnly Property BirthdayValue() As Date

   47     Get

   48       Return DirectCast(MyBase.Item("birthdayValue"), Date)

   49     End Get

   50   End Property

   51  '====>추가

   52   <ConfigurationProperty("woojjaElement")> _

   53   Public ReadOnly Property WoojjaElementValue() As woojjaConfigurationElement

   54     Get

   55       Return DirectCast(MyBase.Item("woojjaElement"), woojjaConfigurationElement)

   56     End Get

   57   End Property

   58 #End Region

   59 End Class 

이제 우리가 원한 것은 모두 구현한 것 같다.
폼에 TextBox 두개를 추가하고 우리가 구현한 사항을 확인해 보자.
아래와 같이 Source 를 수정하고

    1 Imports System.Configuration

    2 Imports Woojja.Configuration

    3 

    4 Public Class Form1

    5 

    6   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    7     Me.TextBox1.Text = ConfigurationManager.AppSettings.Item("woojja").ToString()

    8   End Sub

    9 

   10   Private Sub btnGetinfo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetinfo.Click

   11     Dim woojjaSection As WoojjaConfigurationSection = DirectCast(ConfigurationManager.GetSection("woojja"), WoojjaConfigurationSection)

   12     Dim strName As String = woojjaSection.NameValue

   13     Dim isMan As Boolean = woojjaSection.isManValue

   14     Dim datBirthday As Date = woojjaSection.BirthdayValue

   15     Dim strPhone As String = woojjaSection.WoojjaElementValue.PhoneValue

   16     Dim strEmail As String = woojjaSection.WoojjaElementValue.EmailValue

   17 

   18     txtName.Text = strName

   19     If isMan Then

   20       rdoMan.Checked = True

   21     Else

   22       rdoWoman.Checked = True

   23     End If

   24     txtBirthday.Text = datBirthday.ToString("yyyy-MM-dd")

   25 

   26     txtPhone.Text = strPhone'====>추가

   27     txtEmail.Text = strEmail'====>추가

   28 

   29   End Sub

   30 End Class


그리고 F5를 꾹 눌러보자






다음은 이번에 추가한 Configuration Element 가 여러개 포함된 Section 을 구현할 것이다.
즉... Element Collection 에 관해...


그럼 모두 행복한 고수되셔요..

woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\















저작자 표시 비영리 변경 금지
신고
Posted by woojja

1편은 너무 쉬웠으리라 생각한다.
그냥 Static Member로 구성된 ConfigurationManager 를 이용해 .NET 에서 Configuratoin 파일에 접근할 수 있도록 제공하는 appSettings Section 에 단순히 접근하는 방법에 대해서만 언급했기 때문에...

뭐 처음 하시는 분은 뭐 생소할 수도 있긴 하겠지만 말이다. 나처럼.. ^^

이제부터는 .NET 에서 제공하는 기본적인 appSettings, connectionStrings 이외의 장소에 내게 필요한 정보들을 Configuration 에 저장하기위한 작업을 해보도록 하자.

음... Configuration 의 Properites 를 정의 하는데는 프로그램적정의하는 방법과 선언적(declarative)으로 정의 하는 방법, 두가지 방법을 사용할 수 있다.

시작하자.
우리는 우리만의 Section을 만들고 그 Section 내에 우리들이 관리하고자 하는 정보들을 넣을 것이다.

어떤 정보인가 보면...
요런식의 정보를 넣으려 한다.

그러므로 먼저 Section 을 구성해야하겠다.
Static 한 Property를 정의하는 것부터 시작해 보자.

먼저 "Configuration" 이라는 클래스라이브러리 프로젝트를 하나 추가하자.
그리고 그 클래스 라이브러리의 속성에 들어가서 NameSpace 를 "Woojja.Configuration" 라 설정하고 저장한다.
아래 그림과 같이...

그리고 Configuration 프로젝트에 자동으로 추가되어있는 Class1.vb 를 삭제하고  "WoojjaConfigurationSection.vb" 라는 이름의 Class 를 하나 추가한다.

그리고 "WoojjaConfigurationSection.vb" 의 내용은 아래와 같다.


    1 Imports System

    2 Imports System.Configuration

    3 

    4 Public Class WoojjaConfigurationSection

    5   Inherits ConfigurationSection

    6 

    7   Private Shared woojjaProperties As ConfigurationPropertyCollection

    8 

    9   Private Shared nameProperty As ConfigurationProperty

   10   Private Shared isManProperty As ConfigurationProperty

   11   Private Shared birthdayProperty As ConfigurationProperty

   12 

   13 #Region "생성자"

   14   Shared Sub WoojjaConfigurationSection()

   15     nameProperty = New ConfigurationProperty("nameValue", GetType(String), String.Empty, ConfigurationPropertyOptions.IsRequired)

   16     isManProperty = New ConfigurationProperty("isManValue", GetType(Boolean), False, ConfigurationPropertyOptions.None)

   17     birthdayProperty = New ConfigurationProperty("birthdayValue", GetType(Date), Nothing, ConfigurationPropertyOptions.None)

   18 

   19     woojjaProperties = New ConfigurationPropertyCollection()

   20     woojjaProperties.Add(nameProperty)

   21     woojjaProperties.Add(isManProperty)

   22     woojjaProperties.Add(birthdayProperty)

   23 

   24   End Sub

   25 #End Region

   26 

   27 #Region "Properties"

   28   <ConfigurationProperty("nameValue", isrequired:=True)> _

   29   Public ReadOnly Property NameValue() As String

   30     Get

   31       Return CStr(MyBase.Item("nameValue"))

   32     End Get

   33   End Property

   34 

   35   <ConfigurationProperty("isManValue")> _

   36   Public ReadOnly Property isManValue() As Boolean

   37     Get

   38       Return CBool(MyBase.Item("isManValue"))

   39     End Get

   40   End Property

   41 

   42   <ConfigurationProperty("birthdayValue")> _

   43   Public ReadOnly Property BirthdayValueValue() As Date

   44     Get

   45       Return DirectCast(MyBase.Item("birthdayValue"), Date)

   46     End Get

   47   End Property

   48 #End Region

   49 End Class



그리고 이젠 요렇게 Section을 구성했으니 Configuration 에다가 이런 Section을 사용한다고 선언해야 할 것이다. 요로케...

section name="woojja" type="Woojja.Configuration.WoojjaConfigurationSection, Configuration"

이렇게 되어있는 걸 볼텐데...
name 은 아래 선언할 이름을 나타내고(woojja 라는 태그로 시작한다는 것을 나타낸다.)
type 은 Section 이 정의 되어있는 네임스페이스를 나타내고 assembly 파일 명을 같이 나타낸다.)
클래스 뷰로 확인해 보면
위 그림을 보면 Woojja.Configuration.WoojjaConfigurationSection 이런식의 Hierarchy 를 가지고 있다는 걸 알 수 있을 것이다.
그리고 쉼표다음의 ", Configuration" 는 Configuration 프로젝트를 컴파일하게 되면 만들어지는 assembly 명을 나타낸다.

이젠 잘 되나 한번 보자... ^^

먼저 방금 우리가 추가한 Configuration 프로젝트를 참조추가한다.

이전 1편에서 사용했던 폼을 사용하려 한다.

TextBox 두개와 RadioButton 을 두개 추가하고 버튼도 하나 추가한다.
모양은 이런모양

그리고 Behind Code 를 보게되면

    1 Imports System.Configuration

    2 Imports Woojja.Configuration

    3 

    4 Public Class Form1

    5 

    6   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    7     Me.TextBox1.Text = ConfigurationManager.AppSettings.Item("woojja").ToString()

    8   End Sub

    9 

   10   Private Sub btnGetinfo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetinfo.Click

   11     Dim woojjaSection As WoojjaConfigurationSection = DirectCast(ConfigurationManager.GetSection("woojja"), WoojjaConfigurationSection)

   12     Dim strName As String = woojjaSection.NameValue

   13     Dim isMan As Boolean = woojjaSection.isManValue

   14     Dim datBirthday As Date = woojjaSection.BirthdayValueValue

   15 

   16     txtName.Text = strName

   17     If isMan Then

   18       rdoMan.Checked = True

   19     Else

   20       rdoWoman.Checked = True

   21     End If

   22     txtbirthday.text = datBirthday.ToString("yyyy-MM-dd")

   23   End Sub

   24 End Class


자~~ 이젠 F5 를 쿡 눌러보자...


훔.. 잘가져온다.

에러가 발생하는 경우라고 한다면
아래의 그림처럼 app.config 파일의 Section 의 Type을 선언할때 대소문자를 체크해 보아야 할것이고
assembly 의 Name 을 체크해 보아야 할 것이다.

내용은 길었지만 이번에도 그리 어려운 내용은 아니다.
다음에 진행할 내용도 그리 어려운 내용은 아닐 것이므로 어려워할 필요도 없을 것이다.
빠른시간안에 내용을 진행하도록 하겠다.(벌써 시간이 이렇게 됐네... 아무리 내일이 일요일이지만... ㅡㅡ')

다음 압축파일은 1, 2편에서 사용한 소스가 포함되어있다.


편안한 밤되시고...

행복한 고수되소서..


woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\














저작자 표시 비영리 변경 금지
신고
Posted by woojja
이전버튼 1 이전버튼

티스토리 툴바