第äºéšãžã®ãªã³ã¯
第äžéšãžã®ãªã³ã¯
ããŒã¿å ¥å
ã€ã³ã¹ããŒã©ãŒã¯ãããã€ãã®éå§ãã©ã¡ãŒã¿ãŒãããšãã°ããã°ã©ã ãã€ã³ã¹ããŒã«ããããã©ã«ããŒãžã®ãã¹ãããŒã¿ããŒã¹ãžã®æ¥ç¶æååãªã©ãå ¥åããæ©èœããŠãŒã¶ãŒã«æäŸããå¿ èŠããããŸãã ããã«ãããã¹ããã£ãŒã«ãã ãã§ãªãã䟿å©ãªããŒã¿ãŠã©ãŒã¿ãŒãå¯èœã«ãããã£ãŒã«ãã«ããããšæããŸãã ãããããã°ã©ã ã®ã€ã³ã¹ããŒã«ãã¹ã§ããå Žåãããã¹ããã£ãŒã«ãã«å ããŠãBrowse ...ããã¿ã³ãå¿ èŠã§ããããŒã¿ããŒã¹ãžã®æ¥ç¶æååã§ããå Žåã¯ãããŒã¿ãœãŒã¹ãéžæãŸãã¯äœæããããã®ãã¿ã³ã暪ã«çœ®ããŸãã
å ¥åãã©ãŒã ãã³ãã³ããšããŠå®è£ ããŸãã
public class UserInputCommand: Command { public List<UserInputControl> InputControls { get; set; } public string FormCaption { get; set; } public override void Do(ExecutionContext context) { foreach (UserInputControl input in InputControls) { Control control = input.Create(); // context.InputForm.Controls.Add(control); } } }
InputControlããããã£ãå®è¡ã³ã³ããã¹ãã«è¿œå ããŸããïŒã©ãã§åæåããããŸã ããããŸããïŒãããã¯ããŠãŒã¶ãŒã³ã³ãããŒã«ãè¿œå ããã³ã³ãããŒã³ã³ãããŒã«ã§ãã
UserInputControlã¯ã©ã¹ã¯ãCreateæœè±¡ã¡ãœããã§ã衚瀺ãããŸãã
public abstract class UserInputControl { public string ResultName { get; set; } public int Height { get; set; } public abstract Control Create(); }
ããã¯ãããšãã°UserInputTextBox-åçŽãªããã¹ãå ¥åãã£ãŒã«ããªã©ãç¹å®ã®ãã¹ãŠã®ãŠãŒã¶ãŒã³ã³ãããŒã«ãç¶æ¿ããæœè±¡ã¯ã©ã¹ã§ãã
public class UserInputTextBox : UserInputControl { public string Caption { get; set; } public string InitialValue { get; set; } public override Control Create() { TextBox textbox = new TextBox(); return control; } }
ããã¯åçŽåãããã³ãŒãã§ãã å®éãããã¹ãå ¥åãã£ãŒã«ãã«å ããŠããã£ãã·ã§ã³ããããŒã衚瀺ããã©ãã«ãããããããã®2ã€ã®ã³ã³ãããŒã«ã¯ããã«ã«é 眮ãããCreateã¡ãœããã®çµæãšããŠå®éã«è¿ãããŸãã ãã®äŸã«åºã¥ããŠãUserInputControlããç¶æ¿ããŠãä»ã®ãã¹ãŠã®ãŠãŒã¶ãŒã³ã³ãããŒã«ãäœæããŸãã
ããã«ãå ¥åãã©ãŒã ã¯ãŠãŒã¶ãŒå ¥åã®çµäºãåŸ ã€å¿ èŠããããŸããããã¯ã[次ãž]ãã¿ã³ã®ã¯ãªãã¯ãç¶ããŠãå¥ã®ã¹ããªãŒã ã§ã¡ã€ã³ã€ã³ã¹ããŒã©ãŒå¶åŸ¡ãããŒãèµ·åããããšã§å®è£ ããŸããã
é£èŒ
NETãã©ãããã©ãŒã ã§ååã«ãµããŒããããŠãããããXMLã·ãªã¢ã«å圢åŒãéžæããŸããã System.Xml.Serialization.XmlSerializerã¯ã©ã¹ã䜿çšããŸãã䜿ããããããããªããžã§ã¯ããã·ãªã¢ã«åããã®ã«å¿ èŠãªã³ãŒãã¯3è¡ã ãã§ãSystem.Xml.Serializationåå空éã®å±æ§ã䜿çšããããšã§æè»æ§ãåäžããŸãïŒå¿ èŠãªå ŽåïŒ ã
ãã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
// XmlSerializer ser = new XmlSerializer(typeof(T)); FileStream stream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write); ser.Serialize(stream, obj); // XmlSerializer ser = new XmlSerializer(typeof(T)); stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); result = (T)ser.Deserialize(stream);
ã芧ã®ãšããã以äžã¯å ¥ååŒæ°ã§ããã·ãªã¢ã«åããããªããžã§ã¯ããæžã蟌ãŸãããã¡ã€ã«ãžã®ãã¹ã ãªããžã§ã¯ãèªäœã ã·ãªã¢ã«åå¯èœãªãªããžã§ã¯ãã®ã¿ã€ãã ãã®ã³ãŒãã¯ãä»ã®ã¯ã©ã¹ããç¶æ¿ãããªãã·ãªã¢ã«åã«æé©ã§ãã ãã ããããšãã°ãç¶æ¿éå±€ãCreateFile <-TransactionalCommand <-Commandã§ããCreateFileã¯ã©ã¹ãã·ãªã¢ã«åããå ŽåãT = Commandã§ãã·ãªã¢ã©ã€ã¶ãŒã¯ãXmlIncludeå±æ§ã䜿çšããå¿ èŠãããããšãéç¥ããŸããã·ãªã¢ã©ã€ãºå¯èœãªãªããžã§ã¯ãã ãããŠããããã®å±æ§ãåºæ¬ã¯ã©ã¹Commandã«é©çšããå¿ èŠããªããå¯èœãªãã¹ãŠã®åå«ã«1ã€ã®å±æ§XmlIncludeãæå®ããå Žåãããã¯ããã»ã©åé¡ã«ãªããŸããã ãããŠããŠãŒã¶ãŒã¯Commandã¯ã©ã¹ã®ãœãŒã¹ã³ãŒãã«ã¢ã¯ã»ã¹ããã«ãã©ã°ã€ã³ã®åœ¢ã§ã³ãã³ãã®ã³ã¬ã¯ã·ã§ã³ãå¢ãããšæ³å®ããŠããã®ã§ãããã¯ã·ãªã¢ã©ã€ã¶ãŒããŠãŒã¶ãŒã«ãã£ãŠè¿œå ãããããããã¹ãŠã®ã¯ã©ã¹ãã·ãªã¢ã«åã§ããªãããšãæå³ããŸãã 幞ããªããšã«ã解決çããããŸãã ãã¹ãŠã®çµã¿èŸŒã¿åã¯ãå±æ§ã ãã§ãªããXmlSerializerã³ã³ã¹ãã©ã¯ã¿ãŒã®çŽæ¥ã®åŒæ°ã§ãèšå®ã§ããŸãã2çªç®ã®åŒæ°ã«ã¯ãType []çµã¿èŸŒã¿åã®é åãæå®ã§ããŸãã
Type[] types; XmlSerializer ser = new XmlSerializer(typeof(T), types);
ãããŠããã¯ãã·ãªã¢ã©ã€ã¶ãŒã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããšãã«ã䜿çšããããã¹ãŠã®ã¿ã€ãã«é¢ããæ å ±ãå¿ èŠã§ããããšãæå³ããŸãã ã€ãŸããã€ã³ã¹ããŒã©ãŒã«é¢ããã¡ã¿æ å ±ã
ãã©ã°ã€ã³ãšã¡ã¿ããŒã¿
ãã®ããã®GinMetaDataã¯ã©ã¹ã玹ä»ããŸã
public class GinMetaData { public List<ExternalCommand> Commands { get; private set; } public Type[] IncludedTypes { get; private set; } public static GinMetaData GetInstance(); public void Plugin(string folderPath) public ExternalCommand GetCommandByName(string name) }
ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãåžžã«ãã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã1ã€ã ããããšèããããŸããã€ãŸããã·ã³ã°ã«ãã³ãšããŠå®è£ ããããšãæå³ããŸãã ãã®å ŽåãIncludedTypesããããã£ã«ã¯ãã·ãªã¢ã©ã€ã¶ãŒã§äœ¿çšã§ãããã¹ãŠã®ã¿ã€ããããã³ã¡ã€ã³ã€ã³ã¹ããŒã©ãŒã©ã€ãã©ãªãšãã®ãã¹ãŠã®ãã©ã°ã€ã³ã®äž¡æ¹ã®ã¿ã€ããå«ãŸããŸãã æ°ãããã©ã°ã€ã³ãã¡ã¿ããŒã¿ã«æ¥ç¶ããã«ã¯ããã©ã°ã€ã³ãã©ã«ããŒãžã®ãã¹ãå ¥åãšããŠäœ¿çšããPluginã¡ãœããã䜿çšãããŸãã ç°ãªããã©ã«ãã«å¯ŸããŠè€æ°ãåŒã³åºããšããã¹ãŠã®NETã©ã€ãã©ãªããã©ã°ã€ã³ã®åœ¢åŒã§ã¢ããªã±ãŒã·ã§ã³ã«æ¥ç¶ãããŸãïŒãã¡ãããæ°ããã³ãã³ããšè£å©ã¯ã©ã¹ãå«ãŸããŠããå Žåãé€ããŸãïŒã
ã€ã³ã¹ããŒã©ãŒã§äœ¿çšå¯èœãªãã¹ãŠã®ã³ãã³ããžã®ãªã³ã¯ã¯ãGinMetaData.Commandsãªã¹ãã«ããŒããããŸãã ãããè¡ãããã«ãGinMetaDataã¯ã©ã¹ã«LoadCommandsFromïŒAssemblyïŒã¡ãœãããäœæããŸããã
private void LoadCommandsFrom(Assembly assembly) { foreach (Type type in assembly.GetTypes()) { if (ExternalCommand.ContainsCommand(type)) { ExternalCommand cmd = new ExternalCommand(type); Commands.Add(cmd); _includedTypes.Add(cmd.CommandType); } } }
ãã®ã³ãŒãã§äœ¿çšãããExternalCommandã¯ã©ã¹ãèæ ®ããã ãã§ãã ã€ã³ã¿ãŒãã§ã€ã¹ã¯æ¬¡ã®ãšããã§ãã
public class ExternalCommand { public ExternalCommand(Type type) public Type CommandType { get; private set; } public Command Instance { get; private set; } public PropertyInfo[] Properties { get; private set; } public ConstructorInfo Constructor { get; private set; } public CommandMetadata Metadata { get; private set; } public static bool ContainsCommand(Type type) public object GetProperty(string propertyName) public void SetProperty(string propertyName, object value) public ExternalCommand Clone() }
ExternalCommandã®åã€ã³ã¹ã¿ã³ã¹ã¯ãæ¬è³ªçã«ã¯Commandã¯ã©ã¹ã®åå«ã§ããåã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã®ã©ãããŒã§ãã ExternalCommandã¯ã©ã¹ã«ã¯ãTypeåã®åŒæ°ãæã€1ã€ã®ã³ã³ã¹ãã©ã¯ã¿ãŒããããŸã-NETã¢ã»ã³ããªããããŒããããåã§ãã äžè¬çãªãã©ã°ã€ã³ã¢ã»ã³ããªã§ã¯ãã³ãã³ãã ãã§ãªãè£å©ã¯ã©ã¹ãååšããå¯èœæ§ããããããã¢ã»ã³ããªããèªã¿èŸŒãŸããåããCommandã®ã€ã³ã¹ã¿ã³ã¹ãäœæããåã«ãèªã¿èŸŒãŸããåãæå¹ãªã³ãã³ããã©ããã確èªããå¿ èŠããããŸãã éçã¡ãœããContainsCommandïŒTypeïŒã¯ãããŒããããåããã¹ãŠã®æ£åŒãªèŠä»¶ã«æºæ ããŠãããã©ããããã§ãã¯ããã ãã§ã-åã¯CommandãŸãã¯ãã®åå«ããç¶æ¿ãããå¿ èŠããããåã¯æœè±¡ã§ãã£ãŠã¯ãªããŸãããã®ã¿ã€ãã¯GinIgnoreTypeå±æ§ã§ããŒã¯ãããã¹ãã§ã¯ãããŸããïŒãã©ã°ã€ã³éçºè ããã©ã°ã€ã³ããã€ã³ã¹ããŒã©ãŒã«ãšã¯ã¹ããŒããããã¹ãã§ãªãã¿ã€ããããŒã¯ã§ããããã«ããããã«ç¹ã«å±æ§ãå°å ¥ããŸããïŒã
CommandTypeããããã£ã«ã¯ãããŒããããã³ãã³ãã®ãªãã¬ã¯ã·ã§ã³ã®Typeãªããžã§ã¯ããæ ŒçŽãããInstanceããããã£ã«ã¯ãConstructorã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠäœæãããããŒããããã³ãã³ãã®ã€ã³ã¹ã¿ã³ã¹ãæ ŒçŽãããŸãã Propertiesããããã£ã¯ãã³ãã³ãããããã£ã®é åãæäŸããŸãã ã³ãã³ãã€ã³ã¹ã¿ã³ã¹ã¯ãã³ãã³ããžã®åç §ãšããŠExternalCommandã«æ ŒçŽãããŠããããããã¹ãŠã®ã³ãã³ãã®èŠªã¯ã©ã¹ã§ããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯DoïŒïŒã¡ãœããã®ã¿ãããããã®ã€ã³ã¹ã¿ã³ã¹ã®ããããã£ã¯çŽæ¥å©çšã§ããªãããããã¹ãŠã®ããããã£ãçŽæ¥ãšã¯ã¹ããŒãããŸããé åPropertyInfoã ãããããã®ããããã£ã¯äž»ã«ããããã£ã®ãªã¹ãã«ã®ã¿å¿ èŠã§ãã ç¹å®ã®åããããã£ãèšå®ããã³èªã¿åãããã«ãExternalCommandã¯ã©ã¹ã«ã¯ãGetPropertyïŒæååããŒïŒãšSetPropertyïŒæååããŒããªããžã§ã¯ãå€ïŒã®2ã€ã®ã¡ãœããããããŸãã
ã¡ã¿ããŒã¿ããããã£ã¯ãèªã¿èŸŒãŸããã³ãã³ãã«é¢ããã¡ã¿ããŒã¿ã§ãã ãã®ã¡ã¿ããŒã¿ã䜿çšããŠãããžã¥ã¢ã«ããã±ãŒãžãã¶ã€ããŒã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ã³ãã³ãã衚瀺ããããšãæå³ããŸããã ãã®èšäºã®äž»é¡ã§ã¯ãããŸãããããã®ååšãæ瀺ããå¿ èŠããããŸãã ã³ãã³ãã®ã¡ã¿ããŒã¿ã«ã¯ãã³ãã³ãã®ãã©ã¡ãŒã¿ãŒãååã説æãããã±ãŒãžãã¶ã€ããŒã§ã®è¡šç€ºæ¹æ³ãªã©ãšããŠä¿åã§ããŸãã çŸæç¹ã§ã¯ãããŒã ã®ã¡ã¿ããŒã¿ã«ã¯ãããŒã ã®ååã説æãããã³ããŒã ã°ã«ãŒãã®ååã®2ã€ã®ãã©ã¡ãŒã¿ãŒã®ã¿ãå«ãŸããŠããŸãã
public class CommandMetadata { public string Name { get; set; } public string Desription { get; set; } public string Group { get; set; } }
ã³ãã³ãã®ã°ã«ãŒããããã¯ããã¹ãæååã§ããããã±ãŒãžãã¶ã€ããŒã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ããã³ãã³ãã®ã°ã«ãŒãåããŒãã®ååã§ãã ãªã¹ãå ã®å€æ°ã®ã³ãã³ããã°ã«ãŒãããšã«æ§é åããå¿ èŠããããŸããããšãã°ããã¡ã€ã«æäœãIIS管çãSQLã³ãã³ããæ§é åã³ãã³ããªã©ã§ãã ãããŠä»ã®ã°ã«ãŒãã
ã¡ã¿ããŒã¿ã¯ãå±æ§ã䜿çšããŠããŒã ã«æ·»ä»ãããŸãã ãããŸã§ã®ãšãããGinNameAttributeã³ãã³ãã®ã¡ã¿ããŒã¿å±æ§ã¯1ã€ãããããŸããããã®èª¬æã次ã«ç€ºããŸãã
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] public class GinNameAttribute : Attribute { public string Name { get; set; } public string Description { get; set; } public string Group { get; set; } }
ããšãã°ã次ã®ããã«ã³ãã³ãã¯ã©ã¹ã«é©çšãããŸãã
[GinName( Name = "-", Description = " if-then-else", Group = " ")] public class ExecuteIf : TransactionalCommand, IContainerCommand { // âŠâŠ }
åã³ãã³ããExternalCommandã€ã³ã¹ã¿ã³ã¹ã«èªã¿èŸŒãŸãããšããã®å±æ§ãã³ãã³ãããèªã¿åãããŸããããã«ã¯ãGinNameAttributeå±æ§ãå«ãŸããŸãããã®åŸããã®å±æ§ã¯CommandMetadataã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã«å€æãããŸãã
ã€ã³ã¹ããŒã©ãŒã®ãœãŒã¹ã³ãŒããšããã®äœ¿çšã«é¢ãã3ã€ã®å žåçãªã·ããªãªïŒããã±ãŒãžã®äœæãå®è¡ãããã³ããŒã«ããã¯ïŒãã google-codeã®ãªããžããªãŒã«æçš¿ããŸããã ç¬èªã®ç®çã«äœ¿çšã§ããŸãã ããã¯ãã€ã³ã¹ããŒã©ãŒã®èšèšã«é¢ããæåŸã®æçš¿ã ãšæããŸãã