在MMC 3.0的Snap-In的设计中,如果需要存储自定义数据,那么可以参考下面的例子
public class PersistentScopeNode : ScopeNode { /// <summary> /// Constructor /// </summary> public PersistentScopeNode() { this.DisplayName = defaultDisplayName; this.EnabledStandardVerbs = StandardVerbs.Rename; } /// <summary> /// Handles Rename. Marks snapin as modified so that it saves changes /// </summary> /// <param name="newText">text the displayname is changing to</param> /// <param name="status">status for updating the console</param> protected override void OnRename(string newText, SyncStatus status) { this.DisplayName = newText; this.SnapIn.IsModified = true; } }
以上代码是实现了一个特殊的ScopeNode,有几点是值得关心的
this.EnabledStandardVerbs = StandardVerbs.Rename; //这是为该节点启用标准的一些操作,例如重命名,复制,删除,属性等,这个StandardVerbs的枚举是下面这样的
[Flags] public enum StandardVerbs { None = 0, Cut = 1, Copy = 2, Paste = 4, Delete = 8, Properties = 16, Rename = 32, Refresh = 64, Print = 128, }
第二点,当修改了节点的名称之后,为了通知MMC要进行保存,应该调用下面这句话
this.SnapIn.IsModified = true;
然后,我们还要稍微注意下SnapIn的设计
[SnapInSettings("{D97B71CA-5F46-4584-A89B-D24FF6D6190B}", DisplayName = "- Persistence SnapIn", Description = "Sample - Renames marks as dirty and saves changes")] public class PersistenceSnapIn : SnapIn { private const string defaultDisplayName = "Rename Me and I Save Changes"; /// <summary> /// Constructor /// </summary> public PersistenceSnapIn() { this.RootNode = new PersistentScopeNode(); } /// <summary> /// Snap-in has data? then load /// </summary> /// <param name="status">asynchronous status for updating the console</param> /// <param name="persistenceData">binary data stored in console file</param> protected override void OnLoadCustomData(AsyncStatus status, byte[] persistenceData) { // saved name? then set snap-in to the name if (string.IsNullOrEmpty(Encoding.Unicode.GetString(persistenceData))) { this.RootNode.DisplayName = defaultDisplayName; } else { this.RootNode.DisplayName = Encoding.Unicode.GetString(persistenceData); } }
/// <summary> /// if snapin 'ismodified', then save data /// </summary> /// <param name="status">status for updating the console</param> /// <returns>true for success</returns> protected override byte[] OnSaveCustomData(SyncStatus status) { return Encoding.Unicode.GetBytes(this.RootNode.DisplayName); }
}
其实很好理解的,我们需要重写两个方法,分别是SaveCustomData和LoadCustomData
但是,这些数据到底放在哪里去了呢?
秘密就在那个msc文件里面,就是说如果我们使用CustomData这种方式的话,那么这些数据其实是保存在一个msc文件中的,用二进制编码。
既然是这个原理,可以想到这样不是很理想,因为这样就依赖那个msc文件了。换句话说,如果我直接用mmc再去添加这个snapIn的时候,那么自定义数据就丢失了