整合Spring和DotNetTools Workflow

来源:互联网 发布:软件项目风险管理办法 编辑:程序博客网 时间:2024/06/12 14:37

目的


在企业应用中,很少有组件是孤立存在着,组件总是需要依赖其它组件或是外部配置,集成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> 
  • 原创粉丝点击