整合Spring和DotNetTools Workflow

目的


在企业应用中,很少有组件是孤立存在着,组件总是需要依赖其它组件或是外部配置,集成Spring.net ,能充分利用spring.net的 ioc和aop等功能

在DotNetTools.Workflow中,以下类和Spring密切相关

  • SpringTypeResolver
  • SpringWorkflowFactory
  • SpringConfiguration




    配置SpringTypeResolver




    这里,最先需要介绍的是DotNetTools.Workflow.Util.SpringTypeResolver,这个类使在spring.net中配置IFunctionProvider,IValidator,ICondition等的实现成为可能

     
       <object name="typeResolver" type="DotNetTools.Workflow.Util.SpringTypeResolver,DotNetTools.Workflow"/>
    


    配置IWorkflowStore实现


    SqlClientWorkflowStore和HibernateWorkflowStore配置不兼容Spring.net ,因此,我们需要,创建一个WorkflowStoreFactory
    public class WorkflowStoreFactory
    	{
    		private   IWorkflowStore workflowStore;
    		public   IWorkflowStore CreateInstance(String workflowStoreName,IDictionary props)
    		{
    			if (workflowStore==null)
    			{
    				switch(workflowStoreName.ToLower())
    				{
    					case "memory":
    						workflowStore=new MemoryWorkflowStore();
    						workflowStore.Init(props);
    						break;
    					case "sqlclient":
    						workflowStore=new SqlClientWorkflowStore();
    						workflowStore.Init(props);
    						break;
    					case "hibernate":
    						workflowStore=new HibernateWorkflowStore();
    						workflowStore.Init(props);
    						break;
    					default:
    						throw new NotSupportedException(workflowStoreName);
    										}
    				
    			}
    			return workflowStore;
    
    			
    		}
    	}
    


    然后,我们在spring配置这个workflowStoreFactory
    <object name="workflowStoreFactory" type="DotNetTools.Workflow.WorkflowStoreFactory,DotNetTools.Test"/>
    

    配置MemoryWorkflowStore

    MemoryWorkflowStore的配置最简单,你可以直接配置
    <object name="workflowStore" type="DotNetTools.Workflow.Spi.Memory.MemoryWorkflowStore,DotNetTools.Workflow"/>
    

    也可以通过factory-method/factory-object配置
    <object name="workflowStore" factory-method="CreateInstance" factory-object="workflowStoreFactory">
    <constructor-arg><value>memory</value></constructor-arg>
    <constructor-arg><null/></constructor-arg>
    </object>
    

    配置SqlClientWorkflowStore

    <object name="workflowStore" factory-method="CreateInstance" factory-object="workflowStoreFactory">
    <constructor-arg><value>sqlclient</value></constructor-arg>
    <constructor-arg>
    <dictionary>
    <entry key="connectionString"><value>server=(local);user id=sa;pwd=;database=osworkflow</value></entry>
    </dictionary>
    </constructor-arg>
    </object>
    

    配置HibernateWorkflowStore



     <object name="workflowStore" factory-method="CreateInstance" factory-object="workflowStoreFactory">
    		<constructor-arg><value>hibernate</value></constructor-arg>
            <constructor-arg>
               <dictionary>
                <entry key="hibernate.connection.provider">
                  <value>NHibernate.Connection.DriverConnectionProvider</value>
                </entry>
                <entry key="hibernate.dialect"><value>NHibernate.Dialect.MsSql2000Dialect</value></entry>
                <entry key="hibernate.connection.driver_type">
                  <value>NHibernate.Driver.SqlClientDriver</value>
                </entry>
                <entry key="hibernate.show_sql">
                  <value>true</value>
                </entry>
                <entry key="hibernate.use_outer_join">
                  <value>true</value>
                </entry>
                <entry key="hibernate.connection.connection_string">
                  <value>Server=localhost;initial catalog=osworkflow_hibernate;User ID=sa;Password=;Min Pool Size=2</value>
                </entry>
              </dictionary>
            </constructor-arg>
          </object> 
    






    配置SpringWorkflowFactory



     
        <object name="workflowFactory" type="DotNetTools.Workflow.Loader.SpringWorkflowFactory,DotNetTools" init-method="Init">
    
            <property name="Resource"><value>samples/workflows.xml</value></property>
    <property name="Reload"><value>true</value></property>
    
     </object>
    


    在public preview 0.1.0中,你必须配置Reload参数,否则将出错,此bug将在下次发布时修正


    配置SpringConfiguration



    <object id="configuration" type="DotNetTools.Workflow.Config.SpringConfiguration,DotNetTools.Workflow">
    <property name="Factory"><ref object="workflowFactory"/></property>
    <property name="Store"><ref object="workflowStore"/>
    </object>
    




    配置工作流对象


        <object name="workflow" type="DotNetTools.Workflow.Basic.BasicWorkflow,DotNetTools.Workflow">
            <constructor-arg><value>jjx</value></constructor-arg>
            <property name="Configuration"><ref object="configuration"/></property>
            <property name="Resolver"><ref objectn="typeResolver"/></property>
        </object>
    





    你现在你可以在spring配置IFunctionProvider等,如
    namespace DotNetTools.Workflow.Functions
    {
    	public class MyFunction : IFunctionProvider
    	{
    		public void Execute(IDictionary transientVars, IDictionary args, IPropertySet ps)
    		{
    			Console.WriteLine("myfunction");
    		}
    
    		public MyFunction()
    		{
    			
    		}
    	}
    }
    


    <object name="myfunction" type="DotNetTools.Workflow.Functions.MyFunction,DotNetTools.Test"/>
    




    在工作流文件中,将ProviderFunction,Validator,Condition的type设置为spring,并设置一个参数名为object.name,其值为spring中配置的object 名称
        <function type="spring">
                  <arg name="object.name">
                     myfunction
                  </arg>
                </function>
    

    在public preview 0.1.0 中 ,arg name应该为bean.name


    使用


    	IApplicationContext context=(IApplicationContext)System.Configuration.ConfigurationSettings.GetConfig("spring/context");
    	IWorkflow workflow=(IWorkflow)context.GetObject("workflow");
    



    完整的配置文件如下
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="dotnettools.workflow.util.vsa" type="DotNetTools.Workflow.Util.Vsa.VsaHandler,DotNetTools.Workflow"/>
        <sectionGroup name="spring">
          <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
          <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
        </sectionGroup>
      </configSections>
      <dotnettools.workflow.util.vsa>
        <reference location="dotnettools.test.dll"/>
        <import namespace="System.Text"/>
      </dotnettools.workflow.util.vsa>
      <spring>
        <context>
          <resource uri="config://spring/objects"/>
        </context>
        <objects>
        <object name="myFunction" type="DotNetTools.Workflow.Functions.MyFunction,DotNetTools.Test"/>
       <object name="typeResolver" type="DotNetTools.Workflow.Util.SpringTypeResolver,DotNetTools.Workflow"/>
        <object name="workflowStoreFactory" type="DotNetTools.Workflow.WorkflowStoreFactory,DotNetTools.Test"/>
     <object name="workflowStore" factory-method="CreateInstance" factory-object="workflowStoreFactory">
    <constructor-arg><value>memory</value></constructor-arg>
    <constructor-arg>
    <dictionary>
    <entry key="connectionString"><value>server=(local);user id=sa;pwd=;database=osworkflow</value></entry>
    </dictionary>
    </constructor-arg>
    </object>
            <object name="workflowFactory" type="DotNetTools.Workflow.Loader.SpringWorkflowFactory,DotNetTools.Workflow" init-method="Init">
            <property name="Resource">
              <value>samples/workflows.xml</value>
            </property>
          </object>
          <object name="configuration" type="DotNetTools.Workflow.Config.SpringConfiguration,DotNetTools.Workflow">
            <property name="Factory">
              <ref object="workflowFactory"/>
            </property>
            <property name="Store">
              <ref object="workflowStore"/>
            </property>
          </object>
          <object name="workflow" type="DotNetTools.Workflow.Basic.BasicWorkflow,DotNetTools.Workflow">
            <constructor-arg>
              <value>jjx</value>
            </constructor-arg>
            <property name="Configuration">
              <ref object="configuration"/>
            </property>
            <property name="Resolver">
              <ref object="typeResolver"/>
            </property>
          </object>
        </objects>
      </spring>
    </configuration>
     
首先,你需要安装 C# 扩展。在 Visual Studio Code 中,点击左侧的扩展图标,搜索 C# 并安装即可。安装完成后,你需要配置一些设置,以便让 Visual Studio Code 正确地识别和编译 C# 代码。 1. 配置 OmniSharp 路径 OmniSharp 是一个开源的跨平台 .NET 编辑器服务,它提供了代码分析、自动补全、重构等功能。在 Visual Studio Code 中,C# 扩展使用 OmniSharp 来提供这些功能。因此,你需要配置 OmniSharp 的路径。 打开 Visual Studio Code 的设置(快捷键为 Ctrl + ,),搜索 "omnisharp.path",将其设置为 OmniSharp 的可执行文件路径。例如,在 Windows 上,它可能是 "C:\Users\YourUserName\.vscode\extensions\ms-dotnettools.csharp-1.23.12\omnisharp\1.37.14\OmniSharp.exe"。 2. 配置 .NET Core SDK 路径 C# 扩展需要 .NET Core SDK 来编译和运行 C# 代码。因此,你需要配置 .NET Core SDK 的路径。 打开 Visual Studio Code 的设置,搜索 "dotnet.coreclr.path",将其设置为 .NET Core SDK 的路径。例如,在 Windows 上,它可能是 "C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.0"。 3. 配置 launch.json 文件 launch.json 文件用于配置调试器的启动方式和参数。在 Visual Studio Code 中,你需要配置 launch.json 文件以便正确地启动和调试 C# 代码。 在 Visual Studio Code 中,打开调试视图(快捷键为 Ctrl + Shift + D),点击 "create a launch.json file",选择 ".NET Core",然后根据提示进行配置。通常情况下,你只需要设置 "program" 字段为你要运行的 C# 程序的路径即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值