• MMC 3.0开发 数据持久化设计


    在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的时候,那么自定义数据就丢失了
     
     
     
  • 相关阅读:
    如何使用 Python 创建一名可操控的角色玩家
    Unity查找物体的四大主流方法及区别
    JavaFX桌面应用开发-鼠标事件和键盘事件
    profiler-gpu分析记录
    JavaFX桌面应用开发-Button(按钮)与事件
    CodeCombat代码全记录(Python学习利器)--Kithgard地牢代码1
    spine骨骼动画组件使用详解
    微信小程序animation
    LeetCode--不同路径
    Learning opencv续不足(七)线图像的设计D
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1325450.html
Copyright © 2020-2023  润新知