성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <br /> <div style='font-family: 맑은 고딕, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>간단한 유형의 모듈 제작</div><br /> <br /> 이번 글에서는 간단하게 모듈 추가 절차를 알아볼 텐데, 전체적인 내용은 다음의 글을 정리한 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Composite Application Guidance for WPF - June 2008 How to: Create a Module ; <a target='_tab' href='https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff921345(v=pandp.10)'>https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff921345(v=pandp.10)</a> </pre> <br /> <hr style='width: 50%' /><br /> <br /> 우선, 모듈이란 뭘까요? 위의 링크에서 제공되는 글의 서두에서 그 정의를 찾아볼 수 있는데요.<br /> <br /> <span style='margin: 10px 0px 10px 10px; font-family: 맑은 고딕, Consolas, Verdana; font-style: italic; width: 800px; background-color: #ccffcc; color: #005555;'> A module encapsulates a set of related concerns. Modules are independently developed and deployed, and they interact with each other to create the application.<br /> </span><br /><br /> <br /> 비록 모듈의 정의가 그러하지만, 현실적으로 CAG 프레임워크로 보자면 Unity Framework의 관리하에 놓인 어셈블리라고 보시면 됩니다. 따라서, 모듈로 정의된 어셈블리는 Unity에 의해서 로드되면서 Reflection 등의 과정을 거쳐서 IoC와 같은 헤택을 받게되는 것입니다.<br /> <br /> 실제로 추가를 해보면서 이해를 해보는 것도 좋겠지요.<br /> <br /> "모듈"로 동작되는 어셈블리를 만들기 위해 "[그림 1]"과 같이 "StatusBar"라는 이름으로 프로젝트를 추가합니다.<br /> <br /> [그림 1: StatusBar 프로젝트 추가]<br /> <img alt='impl_cag_app_step_by_step_chapter3_1.png' src='/SysWebRes/bbs/impl_cag_app_step_by_step_chapter3_1.png' /><br /> <br /> 다음의 프로젝트 참조를 참조합니다.<br /> <br /> <ul> <li>PresentationCore.dll</li> <li>PresentationFramework.dll</li> <li>WindowsBase.dll</li> <li>Microsoft.Practices.Composite.dll</li> <li>Microsoft.Practices.Composite.Presentation.dll</li> </ul> <br /> {ModuleName}Module.cs와 같은 이름 규칙에 따라 새로운 Module 타입을 "StatusBarModule.cs"라는 이름으로 추가하고 코드는 다음과 같이 작성해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Practices.Composite.Modularity; using Microsoft.Practices.Composite.Regions; namespace StatusBar { public class StatusBarModule : IModule { private readonly IRegionManager regionManager; public StatusBarModule(<b style='color: Blue;'>IRegionManager regionManager</b>) { this.regionManager = regionManager; } public void Initialize() { <b style='color: Blue;'>this.regionManager.Regions["StatusRegion"].Add(new DefaultStatusBar());</b> } } } </pre> <br /> 우선, StatusBarModule 생성자를 보시면 IRegionManager 인터페이스가 넘어오는 것을 볼 수 있습니다. 실제 인스턴스 타입은 "Microsoft.Practices.Composite.Presentation.Regions.RegionManager"로 정의된 것인데, 런타임 시에 Unity에 의해서 기 등록된 IRegionManager의 인스턴스가 주입(Injection)되어 넘어옵니다.<br /> <br /> 즉, 만약 Unity에 의해서 위의 모듈이 로드되지 않고 단순히 "StatusBarModule test = new StatusBarModule();"과 같은 식으로 생성을 했다면 - 다시 말해서 Unity의 "관리"에 놓이지 않는다면 - IRegionManager 등의 값은 당연히 배정되지 않습니다.<br /> <br /> 그다음으로 Initialize 메서드를 살펴보면,<br /> <br /> 이와 같이 모듈 내에서는 해당 모듈이 제공하는 View / Service를 등록해 주면 되는데, 위의 코드에서는 Region 영역에 "DefaultStatusBar" 뷰를 하나 등록하고 있습니다.<br /> <br /> 본론에서 벗어나지 않기 위해 DefaultStatusBar.xaml은 다음과 같이 간단하게 구현하는 것으로 끝내겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > <UserControl x:Class="StatusBar.DefaultStatusBar" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid> <Button MinWidth="80" MinHeight="25" Name="button1">Button</Button> </Grid> </UserControl> </pre> <br /> 이것으로, 간단한 유형의 모듈 하나가 완성되었습니다. 이제 지금까지 새롭게 만들어진 모듈을 CAG로 하여금 로드를 하라고 시켜야 할 텐데요.<br /> <br /> "<a target='_tab' href='/2/0/691'>이전의 글</a>"에서 Bootstrapper.GetModuleCatalog 안에 DirectoryModuleCatalog를 사용했기 때문에 이렇게 만들어진 Module의 출력 경로를 "$(SolutionDir)\bin\Debug\Modules"로 설정해 주면 되는데, 이번 경우에는 코드로도 추가하는 방법과 폴더를 지정하는 방법을 모두 사용할 수 있도록 하는 예시를 보여주기 위해 StatusBar 모듈을 직접 참조해서 코드로 추가해 보겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > ===== Bootstrapper.cs ===== using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Practices.Composite.UnityExtensions; using System.Windows; using Microsoft.Practices.Composite.Modularity; using System.IO; using StatusBar; namespace DevToolManager { public class Bootstrapper : UnityBootstrapper { protected override DependencyObject CreateShell() { Shell shell = Container.Resolve<Shell>(); shell.Show(); return shell; } protected override Microsoft.Practices.Composite.Modularity.IModuleCatalog GetModuleCatalog() { string modulePath = @".\Modules"; if (Directory.Exists(modulePath) == false) { Directory.CreateDirectory(modulePath); } DirectoryModuleCatalog catalog = new DirectoryModuleCatalog() { ModulePath = modulePath }; <b style='color: Blue;'>catalog.AddModule(typeof(StatusBarModule));</b> return catalog; } } } </pre> <br /> 간단하지요! 단순히 DirectoryModuleCatalog 인스턴스에서 정적 참조한 어셈블리에 정의된 모듈 타입을 AddModule로 전달해 주면 됩니다. 이렇게 해서 실행시키면 버튼 하나가 있는 WPF 응용 프로그램이 실행되는 것을 확인할 수 있습니다.<br /> <br /> [그림 2: StatusBar 모듈이 반영된 실행 화면]<br /> <img alt='impl_cag_app_step_by_step_chapter3_2.png' src='/SysWebRes/bbs/impl_cag_app_step_by_step_chapter3_2.png' /><br /> <br /> <a target='_tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=452&boardid=331301885'>다운로드: 예제 솔루션</a><br /> <br /><br /><hr /><span style='color: Maroon'>[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
3532
(왼쪽의 숫자를 입력해야 합니다.)