[실습으로 다지는 C#] 의존(Dependency) 관계 실습 – Part2

 이번 강의에서는 의존 관계 실습입니다. (Part2 –  이전 강의에서 설계한 내용을 C# 코드로 작성)

*아직 대리자(delegate)를 학습하기 전이면 간략히 보신 후에 대리자를 학습 후에 보시기 바랍니다.*

의존 관계 클래스 다이어그램

여기에서는 ValueChangedEventArgs와 ValueChangedEventHandler를 먼저 작성할게요. 그리고 BindingSystem, Item, ItemControl 형식, Program 진입점 코드 순으로 진행할게요.

 

ValueChangedEventArgs는 Item의 Text값이 바뀔 때 이를 ItemControl에서 처리하기 위해 필요한 형식 인자입니다. ItemControl에서는 값이 바뀐 Item 개체가 자신과 관계가 있는지 파악할 수 있어야 하며 목적에 따라 Item의 Text 속성을 빠르게 접근할 수 있다면 편리할 거예요.

using System;

namespace 의존_관계
{
    public delegate void ValueChangedEventHandler(object sender, ValueChangedEventArgs e);
    public class ValueChangedEventArgs : EventArgs
    {
        public Item Item
        {
            get;
            private set;
        }
        public string Text
        {
            get
            {
                return Item.Text;
            }
        }
        public ValueChangedEventArgs(Item item)
        {
            Item = item;
        }
    }
}

ValueChangedEventHandler는 이벤트 멤버를 위해 정의하는 대리자입니다. 일반적으로 입력 인자는 두 개로 정의합니다. 첫 번째 인자는 이벤트가 발생하였다는 것을 통보하는 개체, 두 번째 인자는 이벤트 처리에 필요한 형식 인자입니다.

앞의 ValueChangedEventArgs.cs 파일 윗 부분에 다음과 같이 정의한 것을 볼 수 있어요.

  public delegate void ValueChangedEventHandler(object sender, ValueChangedEventArgs e); 

 이번에는 BindingSystem을 구현합시다.

 BindingSystem은 하나만 있습니다. 단일체로 표현할 수 있겠죠. 그런데 여기에서는 BindingSyste 내에서 상태를 유지할 것이 없기에 정적 클래스로 정의할게요.

 BindingSystem에는 이벤트 멤버를 캡슐화합니다. 그리고 Item 값이 바뀌었다는 것을 통보받는 메서드(ChandedValue)도 필요합니다.

 Item에서 값이 바뀌었다는 통보가 오면 등록한 이벤트 핸들러를 호출합니다. 이 때 이벤트 인자 개체를 생성하여 전달합니다. BindingSystem에서는 이벤트 인자 형식 개체를 생성하는 책임을 갖고 있어서 둘 사이(BindingSystem과 Item)는 의존 관계입니다.

namespace 의존_관계
{
    public static class BindingSystem
    {
        public static event ValueChangedEventHandler ValueChangedEventHandler = null;
        public static void ChangedValue(Item item)
        {
            if(ValueChangedEventHandler != null)
            {
                ValueChangedEventArgs e = new ValueChangedEventArgs(item);
                ValueChangedEventHandler(null, e);
            }
        }
    }
}

Item 형식은 Text를 멤버로 갖는 간단한 형식입니다. 여기에서는 원본 개체 형식이며 자신의 Text값이 바뀔 때 BindingSystem에서 이를 인지할 수 있게 통보해 주어야 합니다.

namespace 의존_관계
{
    public class Item
    {
        string text;
        public string Text
        {
            get
            {
                return text;
            }
            set
            {
                text = value;
                BindingSystem.ChangedValue(this);
            }
        }
        public Item(string text)
        {
            this.text = text;
        }
        public override string ToString()
        {
            return text;
        }

    }
}

 ItemControl에서는 생성자에서 BindingSystem에게 이벤트 핸들러를 등록합니다. 그리고 이벤트 핸들러에서는 전달받은 인자의 Item 개체가 자신과 의존 관계인 개체인지 확인하여 맞다면 화면 내용을 변경합니다. 다른 부분은 특별한 부분이 없어서 설명을 생략할게요.

using System;

namespace 의존_관계
{
    public class ItemControl
    {
        bool isshow;
        public Item Item
        {
            get;
            set;
        }
        public string Text
        {
            get
            {
                return Item.Text;
            }
        }
        public ItemControl(Item item)
        {
            Item = item;
            isshow = false;
            BindingSystem.ValueChangedEventHandler += BindingSystem_ValueChangedEventHandler;           
        }

        private void BindingSystem_ValueChangedEventHandler(object sender, ValueChangedEventArgs e)
        {            
            if((e.Item == Item)&&isshow)
            {
                Show();
            }
        }

        public void Show()
        {
            isshow = true;
            Console.WriteLine(Text);
        }
    }
}

실행 결과는 다음과 같습니다.

언제나 휴일
행복
Hello