⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filepersistence.cs

📁 WF本质论一书的源码,要书籍的朋友同我联系.
💻 CS
字号:
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Workflow.ComponentModel;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using System.Workflow.ComponentModel.Serialization;

namespace EssentialWF.Services {
  
    public class FilePersistenceService : WorkflowPersistenceService {
    private string location;
    private bool unloadOnIdle = false;

    public string Location {
      get { return this.location; }
    }

    protected override bool UnloadOnIdle(Activity activity) {
      return this.unloadOnIdle;
    }

    public FilePersistenceService(string location) {
      this.location = location;
    }

    public FilePersistenceService(string location, bool unloadOnIdle) {
      this.location = location;
      this.unloadOnIdle = unloadOnIdle;
    }

    string BuildFilePath(Guid ctxid) {
      return Path.Combine(this.Location, ctxid.ToString() + ".bin");
    }

    protected override Activity LoadCompletedContextActivity(Guid ctxId, Activity outerActivity) {
      return Load(ctxId, outerActivity);
    }

    protected override Activity LoadWorkflowInstanceState(Guid instanceId) {
      return Load(instanceId, null);
    }

    protected override void SaveCompletedContextActivity(Activity ctxActivity) {
      this.Save(ctxActivity, true);
    }

    protected override void SaveWorkflowInstanceState(Activity rootActivity, bool unlock) {
      this.Save(rootActivity, unlock);
    }

    void Save(Activity activity, bool unlock) {
      Guid ctxid = (Guid)activity.GetValue(Activity.ActivityContextGuidProperty);

      string filePath = this.BuildFilePath(ctxid);

      if (File.Exists(filePath))
        File.Delete(filePath);

      using (FileStream fs = new FileStream(filePath,FileMode.CreateNew)) {
        IFormatter formatter = new BinaryFormatter();
        formatter.SurrogateSelector = ActivitySurrogateSelector.Default;

        activity.Save(fs, formatter);
      }

      if (!unlock)
        File.SetAttributes(filePath, FileAttributes.ReadOnly);
    }

    Activity Load(Guid ctxid, Activity outerActivity) {
      string filePath = this.BuildFilePath(ctxid);

      using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) {
        fs.Seek(0, SeekOrigin.Begin);
        IFormatter formatter = new BinaryFormatter();
        formatter.SurrogateSelector = ActivitySurrogateSelector.Default;

        return Activity.Load(fs, outerActivity, formatter);
      }
    }

    protected override void UnlockWorkflowInstanceState(Activity rootActivity) {
      Guid ctxid = (Guid)rootActivity.GetValue(Activity.ActivityContextGuidProperty);
      string filePath = this.BuildFilePath(ctxid);
      using (FileStream fs = new FileStream(filePath, FileMode.Open))
        File.SetAttributes(filePath, FileAttributes.Normal);
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -