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