ããããã€habrazhitelïŒ
Windows Phoneã§ã®ã¢ããªã±ãŒã·ã§ã³ã®åäœãã¹ãäžã«ã³ãŒãã«ãã¬ããžã®å¶åŸ¡ã確ç«ããããšã§ãç§ã®ææãå ±æããããšæããŸãã ãã®åé¡ã解決ããéã«ããæ£ãããã¢ããªã±ãŒã·ã§ã³èšèšã®ããã€ãã®åŽé¢ã«å¯ŸåŠããªããã°ãªããªãã£ãããšã¯æ³šç®ã«å€ããŸãã ãããã£ãŠããã®æçš¿ã¯å°ããªæç§æžãšèŠãªãããšãã§ããŸãã
åé¡ã®å£°æ
äžããããïŒ
Windows Phoneçšã®å°ããªã¢ããªã±ãŒã·ã§ã³ã®éçºãå§ãŸããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯å žåçãªãã®ã§ã-ãµãŒããŒããããŒã¿ãååŸããäœããã®åœ¢ã§ãŠãŒã¶ãŒã«è¡šç€ºããŸãã
å¿ é ã§ãïŒ
ã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ãèšèšããŠãç¶ç¶çãªçµ±åã«ãããäœæ¥ã®ããžãã¯ãæ åœããã¢ããªã±ãŒã·ã§ã³ã®æ倧ã³ãŒããããã®ã«ãã¬ããžãå¶åŸ¡ããæ©èœãåãããã¹ãã«ãã£ãŠéããããããã«ããŸãã
äžè¬çãªã¢ãããŒã
ãã§ã«æžããããã«ãWindows Phoneã©ã³ã¿ã€ã ã«ã¯ã³ãŒãã«ãã¬ããžãå¶åŸ¡ããæ段ããããŸããã§ããã Naggãšhalkarã®ã¢ããã€ã¹ã§ãPortable Class Libraryã®ã¢ããªã±ãŒã·ã§ã³ã®æ©èœïŒããžãã¯ïŒã§ã³ãŒããã¬ã³ããªã³ã°ããŸããã ããã«ãããã«ãã¬ããžå¶åŸ¡ãåããæšæºã®.NET Frameworkç°å¢ã§ãã¹ããå®è¡ã§ããŸããã ããã«ããã®ã¢ãããŒãã¯ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã®ã·ã¹ãã ã§ã·ã£ãŒãããºã ãæé€ãããã¹ãã®å®è¡æéãççž®ããŸãã
ãããã£ãŠãç°¡åãªæ¹æ³ã§ãã¢ããªã±ãŒã·ã§ã³ã¯3ã€ã®ã³ã³ããŒãã³ãã®åœ¢åŒã§è¡šãããšãã§ããŸãã
ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã¯ãWindows Phoneã©ã³ã¿ã€ã ãŸãã¯ãã¹ãç°å¢ã«äŸåããªãPCLã«ãããŸãã
Windows Phoneã¢ããªã±ãŒã·ã§ã³ã¯ãã®ã©ã€ãã©ãªã䜿çšããXAMLããŒã¯ã¢ãããšæå°éã®ã³ãŒããå«ã¿ãŸãã
ãã¹ãDLLã¯PCLãåç §ããå®éã®ãã¹ãã³ãŒããå«ãŸããŠããŸãã MSTestããã¹ããã¬ãŒã ã¯ãŒã¯ãšããŠäœ¿çšããŸããããåé¡ã§ã¯ãããŸããã
ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã¯ç空ã§åäœããããšã¯ã§ããŸãããWebãµãŒããŒãWindows Phoneã«çŽæ¥æ¥ç¶ãããŠããä»ã®ãŠãŒã¶ãŒãšãŠãŒã¶ãŒãšå¯Ÿè©±ããå¿ èŠããããŸãã åæã«ããã¹ããå®è¡ããå Žåããã®çžäºäœçšã¯éåžžã®.NET Frameworkã®ç°å¢ã§æ¢ã«äœããã®æ¹æ³ã§ãšãã¥ã¬ãŒããããå¿ èŠããããŸãã
ãã®çµæãPCLãã以äžãçºè¡ãããŸããã
- WebãµãŒããŒã§ã®äœæ¥ïŒèŠæ±ã®éä¿¡ãšå¿çã®åä¿¡ïŒ
- ãã¡ã€ã«ã®æäœïŒä¿åãèªã¿åãããªã¹ãã®ååŸïŒ
- æååãªãœãŒã¹ã®ããŒã«ã©ã€ãº
- ã€ã³ã¿ãŒãããæ¥ç¶ã®å¯çšæ§ã確èªãã
- ä»ã®äœã
ããã«ã€ããŠããå°ãæ€èšããŠãã ããã ã¢ããªã±ãŒã·ã§ã³ã®äžè¬åãããã¹ããŒã ã¯æ¬¡ã®ããã«ãªããŸãã
- HTTPèŠæ±ããµãŒããŒã«éä¿¡ãããŸã
- åçãåãå ¥ããããŸãã
- åçã®è§£æ/åŠç
- å解çµæã衚瀺ãããŸãã
ãã¹ãããããžãã¯ã¯ã¹ããŒãž3ã®ã¿ã§ãããã®å Žåãä»ã®ãã¹ãŠã®ã¹ããŒãžãæ åœããã³ãŒããPCLããåé€ããããšã¯è«ççã§ãã
Windows Phoneã®ç»é¢ã«è¡šç€ºããå Žåããã®ãããªåé€ã¯éåžžã«ééçã§ããViewModelsã¯PCLã«ãããViewModelsãžã®ã³ã³ãããŒã«ã®ãã€ã³ãããããã£ã¯XAMLã§èª¬æãããŠããŸãã ãã¹ãäžã«ãViewModelã®å¿ èŠãªããããã£ãšã¡ãœããããã«ãããŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãã·ãã¥ã¬ãŒããããããã«å¯Ÿããåå¿ããã§ãã¯ããã ãã§ãã
次ã«ããµãŒããŒã®æäœãæ€èšããŸãã PCLã«ã¯HTTPã¯ã©ã€ã¢ã³ãå®è£ ïŒ
HttpWebRequest
ïŒããããPCLã§WebãµãŒããŒã³ãŒããçŽæ¥èšè¿°ããããšã¯è«ççã«æããŸãã
ãã ããã¢ããªã±ãŒã·ã§ã³ã®ããžãã¯ããã¹ãããããšãç®æšã§ããããšãå¿ããŠã¯ãªããŸããã WebãµãŒããŒãžã®èŠæ±ãPCLã«éä¿¡ããããã®ã³ãŒãããã£ãããšçž«ãå Žåããã¹ãã®ããã«ããµãŒããŒãã·ãã¥ã¬ãŒãããŠå¥ã®WebãµãŒããŒãäžããããäœããã®æ¹æ³ã§èŠæ±ãã€ã³ã¿ãŒã»ããããå¿ èŠããããŸãã
ç¶ããŸãããã åŠçäžã«ãããŒã¿ããã£ãã·ã¥ããããšãã§ããŸã-ããã€ã¹äžã®ãã¡ã€ã«ãšããŠä¿åãããŸãã ãã ããPCLã«ã¯å®å šãªãã¡ã€ã«ç®¡çããŒã«ããããŸããã ããã¯ãç°ãªãã©ã³ã¿ã€ã ãç°ãªãã¹ãã¬ãŒãžç·šæã¡ã«ããºã ã䜿çšãããšããäºå®ã«ãããã®ã§ãã ãããã£ãŠã䜿ãæ £ãã.NETã§ã¯ãéåžžã®ããã¡ã€ã«ïŒããšãã°ã
File
ïŒã§ãããWindows Phoneã§ã¯
IsolatedStorageFile
ã§ãã ãŸãããã¹ãäžã«ãã®ãããªãªããžããªãã·ãã¥ã¬ãŒãããå¿ èŠãããããšãå¿ããªãã§ãã ããã
å®éã®åé¢ã¯ç°¡åãªæ¹æ³ã§è¡ãããŸãããPCLã§ã¯ãWebãªã¯ãšã¹ãããã¡ã€ã«ãããŒã«ã©ã€ãºãªã©ãæäœããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã宣èšããç¬èªã®ä»æ§ã§Windows Phoneã¢ããªã±ãŒã·ã§ã³ã«æ¢ã«å®è£ ããŠããŸãã ãããã£ãŠããã¹ãç®çã§ã¯ããã©ã€ããç°å¢ã®äœæ¥ãå€å°ãªããšã確å®ã«ã·ãã¥ã¬ãŒããããããªæ¹æ³ã§ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããå¿ èŠããããŸãã
å¶åŸ¡ã®å転
ããçšåºŠã®è¿äŒŒã§ã¯ããã®åŠå®ã¯å¶åŸ¡ã®ç§åŠçé転ãšåŒã°ããŸãã ç§
ããšãã°ããã¡ã€ã«ã€ã³ã¿ãŒãã§ã€ã¹ãèŠãŠã¿ãŸãããã
public interface IFileStorage { Stream GetWriteFileStream(string fileName); Stream GetReadFileStream(string fileName); bool IsFileExists(string fileName); List<string> GetAllFileNames(string path); }
ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãã¹ãã¬ãŒãžã®è©³çŽ°ã«å ¥ããã«ãã¡ã€ã«ãæäœããã®ã«ååã§ãã ãããã£ãŠããã以äžäœãç¥ããªãã®ã¯ããã®ã€ã³ã¿ãŒãã§ãŒã¹ãšPCLã«ã€ããŠã§ãã Windows Phoneã¢ããªã±ãŒã·ã§ã³ã«å®è£ ãããå®è£ ã¯
IsolatedStorageFile
䜿çšããŸãã
ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãã¹ãDLLã«ãå®è£ ãããŠãããéåžžã«ããªããã£ãã§ãããã¹ãŠã®ãã¡ã€ã«ã¯ã
Dictionary<string, MemoryStream>
圢åŒã§ã¡ã¢ãªã«ä¿åãããŸãã ãããã£ãŠãããã°ã©ã ã®ããžãã¯ã¯ãå®éã®ãã¡ã€ã«ã§æ©èœãããšèããŠæºè¶³ããŠããŸãããŸãããã¹ãã®ç¬ç«æ§ã®åé¡ã解決ããŠããã®ã§æºè¶³ããŠããŸãã æ°ãããã¹ã-ã¯ã©ã¹ã®æ°ããã€ã³ã¹ã¿ã³ã¹-ã¯ãªãŒã³ãªããã¡ã€ã«ã·ã¹ãã ãã
ãã ãããã¡ã€ã«ã«å ããŠãWebãããŒã«ãªãŒãŒã·ã§ã³ãªã©ãšäœæ¥ãåãé¢ãå¿ èŠããããŸãã 䟿å®äžãããããã¹ãŠãå¥ã®ã€ã³ã¿ãŒãã§ã€ã¹ã§çµã¿åãããŸãã
public interface IContainer { IFileStorage FileStorage { get; } IDataRequest DataRequest { get; } ILocalizer Localizer { get; } IUiExtenter Extender { get; } DateTime Now { get; } }
ç§ã¯ããããã³ã³ããããšåŒã³ãŸãããããå¶åŸ¡ã®å転ããã³ãã¬ãŒãã®çšèªã§ã¯ãããã¯å®å šã«æ£ãããšã¯éããŸããã
ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ããã¡ã€ã«ïŒ
FileStorage
ïŒããµãŒããŒãªã¯ãšã¹ãïŒ
DataRequest
ïŒãããŒã«ãªãŒãŒã·ã§ã³ïŒ
Localizer
ïŒããã³ãã®ä»ïŒ
Extender
ïŒãæäœããããã®PCLããžãã¯ããŒã«ãæäŸããç°¡æœã«ããããã«1ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«çµ±åãããŠããŸãã
ãããšã¯å¥ã«ãNowããããã£ã«æ³šç®ããŸãã ãã¹ãå°çšã§ãã å®éã®ãšãããå€ãã®å Žæã§ããžãã¯ã¯çŸåšã®æå»ã«é¢é£ä»ããããŠããããã¹ãç°å¢ãæ£ãããšãã¥ã¬ãŒã·ã§ã³ããã«ã¯ããã®æå»ãå€æŽããå¿ èŠããããŸãã ã·ã¹ãã æå»ãå€æŽããã®ã¯æªãèãã§ãããã®ããããã®ããããã£ã衚瀺ãããŸãã äž»ãªããšã¯ã
DateTime.Now
代ããã«ãã®ããããã£ã䜿çšããå¿ èŠãããããšãæãåºãããšã§ããã
ã³ã³ããã«ã¯ãWindows Phoneã¢ããªã±ãŒã·ã§ã³ãšãã¹ãDLLã®2ã€ã®å®è£ ããããŸãã åã³ã³ããã¯ããã®ã€ã³ã¿ãŒãã§ã€ã¹å®è£ ããã¹ãªãããããŸããã ãã®ããããã¹ãDLLã®ã³ã³ããã¯
IDataRequest
ãã¹ã¿ãã®åœ¢åŒã§å®è£ ãããã¹ãã§ãµãŒããŒã®å¿çãšéä¿¡ã®åé¡ãã·ãã¥ã¬ãŒãã§ããããã«ããŸããã
IContainer
ãå®è£ ãããªããžã§ã¯ãã¯ãã¢ããªã±ãŒã·ã§ã³ã®æåã«äœæãããŸãã ãã¹ãäžã«ããã¹ãããšã«ãã®ãããªæ°ãããªããžã§ã¯ããäœæãããŸãã ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã管çããã¯ã©ã¹ã«ã¯ããã®ãªããžã§ã¯ããžã®åç §ãå¿ èŠã§ãã ãããè¡ãç°¡åãªæ¹æ³ã¯ããã¹ãŠã®ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«ãªã³ã¯ãèŠæ±ããããšã§ãã
ãã¡ããã Unity Application Blockãªã©ãå¶åŸ¡ã¹ããŒã ã®å転
åé¡
çè«çã«ã¯ãã¹ãŠãçŸããçŸããèãããŸãããå®éã«ã¯ããã€ãã®åé¡ã«çŽé¢ããªããã°ãªããŸããã§ããã å³å¯ã«èšãã°ãPCLã§ãã¹ãŠã®ããžãã¯ãäœæããããšã¯ã§ããŸããã§ããã ãã®ãããããŒãžéã®ããã²ãŒã·ã§ã³ãDependencyããããã£ãäœæããããã®ã³ãŒããããã³ãã®ä»ã®ããã€ãã¯ãWindows Phoneã¢ããªã±ãŒã·ã§ã³ãããžã§ã¯ãã«æ®ã£ãŠãããããã¯ããŒãºããã¹ãã§ã¯ãããŸããã§ããã çè«çã«ã¯ããã®ã³ãŒãã®å€§éšåãPCLã«è»¢éã§ããŸãããããã«ãããæœè±¡åã®äžåœãªïŒãã¡ããIMHOïŒè¥å€§åãèµ·ãããçµæãšããŠå°æ¥ã®ã³ãŒãã®ãµããŒããè€éã«ãªããŸãã
å¥ã®åé¡ã¯ãXAMLã®ããããã£ãå¶åŸ¡ããããã®ViewModelsããããã£ã®ãã€ã³ãã§ãã åŸè ã®å€ãã«ã¯ãPCLã§ã¯äœ¿çšã§ããªãç¹å®ã®ã¿ã€ãïŒ
Brush
ã
Visibility
ïŒããããŸãã ãã®åé¡ã¯å€æã¡ã«ããºã ã«ãã£ãŠçŸãã解決ãããŸãããå€æ°ã®ã³ã³ãããŒã«ã䜿çšãããšããã®ãããªå€æã«ãã£ãŠã¢ããªã±ãŒã·ã§ã³ã®é床ãå€§å¹ ã«äœäžããå¯èœæ§ãããããšãèŠããŠããå¿ èŠããããŸãã
ããäžã€
ç§ã«ã¯ãããæ£ç¢ºã«å®è£ ã§ããããã«æããããã®ãããã€ããããŸããããã®æ¹æ³ã¯ããããŸããã æ£ããéãèšå®ããŠãã ãã£ãæ¹ã ã«æè¬ããŸãã
æåã®ããšã ã·ã¹ãã ã®ããžãã¯ã«åŸã£ãŠãã¢ã«ãŽãªãºã ã®ç¹å®ã®å Žæã§ããŠãŒã¶ãŒã«éžæè¢ã®ãããã€ã¢ãã°ã衚瀺ãããŠãŒã¶ãŒã®éžæã«å¿ããŠã¢ã«ãŽãªãºã ãç¶è¡ããå¿ èŠããããŸãã ã³ã³ããã€ã³ã¿ãŒãã§ã€ã¹ã®1ã€ã«ShowDialogã¡ãœãããå®è£ ããPCLã®ã³ãŒãããçŽæ¥åŒã³åºãããšã»ã©è¯ããã®ã¯æãã€ããŸããã§ããã ãããã£ãŠããã®ã¡ãœããã®ãæŠéãå®è£ ã§ã¯å®éã®ãã€ã¢ãã°ã衚瀺ããããŠãŒã¶ãŒã®éžæãåŸ ã£ãŠããŸãããããã¹ãã§ã¯äºåã«èšå®ãããå€ãè¿ãããŸããã
第äºã«ã ãã®ããžãã¯ã¯ãã¿ã€ããŒã³ã³ãããŒã«ã®ç¶æ ãæŽæ°ããŸãã ãã ããPCLã§äœ¿çšå¯èœãª
Timer
ã¯ã©ã¹ã¯ãå¥ã®ã¹ã¬ããã§ééçµäºãã³ãã©ãŒãåŒã³åºããŸãã ãã®å ŽåãèŠçŽ ã®ç¶æ ãæŽæ°ããããšãããšå€±æããŸãã ç§ã®é ã®äžã®è§£æ±ºçã¯ãåŒæ°ãšããŠããªã²ãŒããæã€ã¡ãœãããã€ã³ã¿ãŒãã§ã€ã¹ã«èšè¿°ããããšã§ãã ãæŠéãå®è£ ã§ã¯ããã®ã¡ãœããã¯
BeginInvoke
ãåŒã³åºããŠã¡ã€ã³ã¹ã¬ãããšãã¹ãã§åæããŸã-åã«ããªã²ãŒããåŒã³åºããŸãã
æãå±ããªããŸã§
ãŸãšã
æ®ãã®ãã¹ãã§ã¯ãã»ãšãã©ã®æ©èœãéããããŸããã ViewModelsãã¹ãã³ãŒãã¯ãå®éã®ãã¹ãã±ãŒã¹ã®èª¬æã«äŒŒãŠããŸãïŒããããã¯ãªãã¯ã-ãããã«ãã®ãããªçªå·ãå ¥åã-ãå€ãæåŸ å€ãšæ¯èŒãïŒã
ãã®ãããªãã¹ããæžãããšã¯ãéçºè ãå¿ããã¹ã¿ãŒãããæ°ã«ãããè¯ãæ¹æ³ã§ãã ãããŠã圌ãã¯ã¯ãªãã¯ãã代ããã«ã³ãŒããæžããŠåãã§ããŠããã¹ããé²è¡äžã§ã:)
ã¹ã¯ãªãããšãã°ãå«ãã¢ã€ãã¢ããªããªã£ããšããTeamCityã®ç·è²ã®ç®ã§ãæŠéäž
æãéèŠãªçµæã¯ãã³ãŒãã®å®è¡åŸããã¹ãããåæ Œãããè¡ãšå€æŽãããŠããªãè¡ã確èªã§ããããšã§ãã ãã®ããŒã¿ã¯ãçµ±èšã®åœ¢åŒïŒã圱é¿ãåãããã¯ã©ã¹ãã¡ãœãããããã³è©³çŽ°ã¬ãã«ã®ç°ãªãã³ãŒãè¡ïŒã®äž¡æ¹ãããã³èµ€ãšç·ã®è²ä»ãã®ãœãŒã¹ã³ãŒãã®åœ¢åŒã§è¡šç€ºãããŸãã
ãã¹ãŠã®ã³ãŒããã¹ããéããããšãã§ããŸããã§ããã ãããã£ãŠãã³ã³ããã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ãšåæ§ã«ãåé¢ã³ãŒãã¯å®çŸ©ã«ããéããããã«æ®ããŸãã ãã ããPCLå ã«ãã£ããã®ïŒããã³ããã¯ããã®æ©èœã«çŽæ¥é¢äžããããã°ã©ã ã³ãŒãã®ã»ãšãã©ã§ãïŒã¯ãéåžžã«ããã«ããŒãããå¶åŸ¡ãããŠããŸãã
ç§ã¯ããã¢ãªã®ã§ãã¡ãœããã®ã«ãã¬ããžã100ïŒ æªæºã®å ŽåïŒãã¹ããå ¥åãããªãã£ãã©ã ãåŒãªã©ãå¶åŸ¡ãããã³ãŒãã«å°ãªããšã1ã€ã®ã¡ãœããããã£ãå ŽåïŒããã«ããããã©ãŒã«ãã«èšå®ããŸãã æ®éã®äººã«ãšã£ãŠã¯ããã®ãããªå¶åŸ¡ã¯ããããå€ãããã§ãããã
ãããã«ãããã³ãŒãã«ãã¬ããžã¯ãã¹ãã«ããæ©èœçã«ãã¬ããžãšçžé¢ããŠãããèµ€ãç·ã®ç 究ã¯ãã°ãã°ããšã³ã³ãŒããã¹ããã¹ãã·ããªãªã«ã€ããŠã®èããä¿ããŸããã
äž»ãªçµè«ã¯ãWindows Phoneã®å Žåãã³ãŒãã«ãã¬ããžå¶åŸ¡ã䜿çšããŠåäœãã¹ããæŽçã§ãããšããããšã§ãã
ã«ãã¬ããžã¡ããªãã¯ãæ£åŒã«äœ¿çšããããšã¯ããã¡ããç¡æå³ã§ãã ãã ããããã¯ä»ã®ã¡ããªãã¯ã®æ£åŒãªäœ¿çšã«é©çšãããŸãã ããããã³ãŒãã£ã³ã°ãæéã®ãããKPIãšããŠã§ã¯ãªããå質ãæ¹åããããã®ããŒã«ãšããŠèããå Žåãããã¯éåžžã«åŒ·åãªããšã§ãã