• 使用Apworks开发基于CQRS架构的应用程序(八):应用程序的配置与编译


    Apworks使用配置文件来启动整个系统。在上文中也能够看出,WCF服务在启动时,同时也启动了Apworks系统。所以,本节简要介绍这个WCF服务针对Apworks的相关配置节内容。

    双击TinyLibrary.Services项目的web.config文件,根据下面的XML代码编辑该文件。

       1: <?xml version="1.0"?>
       2: <configuration>
       3:  
       4:   <configSections>
       5:     <section name="apworksConfiguration" 
       6:              type="Apworks.Config.ApworksConfigHandler, Apworks"/>
       7:     <section name="unityConfiguration" 
       8:              type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
       9:   </configSections>
      10:  
      11:   <apworksConfiguration>
      12:     <application bootStrapper="Apworks.Application.BootStrapper, Apworks"/>
      13:     <objectContainer provider="Apworks.ObjectContainers.Unity.UnityContainer, Apworks.ObjectContainers.Unity" section="unityConfiguration"/>
      14:  
      15:     <generators>
      16:       <generator name="defaultIdentityGenerator" kind="Identity" type="Apworks.Generators.SequentialIdentityGenerator, Apworks"/>
      17:       <generator name="defaultSequenceGenerator" kind="Sequence" type="Apworks.Generators.SequentialIdentityGenerator, Apworks"/>
      18:     </generators>
      19:  
      20:     <handlers>
      21:       <handler name="TinyLibraryCommandHandlers"
      22:                kind="Command"
      23:                sourceType="Assembly"
      24:                source="TinyLibrary.CommandHandlers"/>
      25:       <handler name="TinyLibraryEventHandlers"
      26:                kind="Event"
      27:                sourceType="Assembly"
      28:                source="TinyLibrary.EventHandlers"/>
      29:     </handlers>
      30:  
      31:   </apworksConfiguration>
      32:  
      33:   <unityConfiguration>
      34:     <container>
      35:       <register type="Apworks.Events.Serialization.IDomainEventSerializer, Apworks"
      36:             mapTo="Apworks.Events.Serialization.DomainEventXmlSerializer, Apworks">
      37:       </register>
      38:  
      39:       <register type="Apworks.Storage.IStorageMappingResolver, Apworks"
      40:                   mapTo="Apworks.Storage.XmlStorageMappingResolver, Apworks"
      41:                   name="DomainEventStorageMappingResolver">
      42:         <constructor>
      43:           <param name="fileName" value="DomainEventStorageMappings.xml"/>
      44:         </constructor>
      45:       </register>
      46:  
      47:       <register type="Apworks.Events.Storage.IDomainEventStorage, Apworks"
      48:                 mapTo="Apworks.Events.Storage.SqlDomainEventStorage, Apworks">
      49:         <constructor>
      50:           <param name="connectionString" 
      51: value="Data Source=.\SQLEXPRESS;Initial Catalog=TinyLibraryEventDB;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True;"/>
      52:           <param name="mappingResolver">
      53:             <dependency type="Apworks.Storage.IStorageMappingResolver, Apworks" name="DomainEventStorageMappingResolver"/>
      54:           </param>
      55:         </constructor>
      56:       </register>
      57:  
      58:       <register type="Apworks.Bus.ICommandBus, Apworks" mapTo="Apworks.Bus.DirectBus.DirectCommandBus, Apworks.Bus.DirectBus">
      59:         <constructor>
      60:           <param name="dispatcher">
      61:             <dependency type="Apworks.Bus.IMessageDispatcher, Apworks"/>
      62:           </param>
      63:         </constructor>
      64:         <lifetime type="ContainerControlledLifetimeManager"/>
      65:       </register>
      66:  
      67:       <register type="Apworks.Bus.IEventBus, Apworks" mapTo="Apworks.Bus.DirectBus.DirectEventBus, Apworks.Bus.DirectBus">
      68:         <constructor>
      69:           <param name="dispatcher">
      70:             <dependency type="Apworks.Bus.IMessageDispatcher, Apworks"/>
      71:           </param>
      72:         </constructor>
      73:         <lifetime type="ContainerControlledLifetimeManager"/>
      74:       </register>
      75:  
      76:       <register type="Apworks.Bus.IMessageDispatcher, Apworks" mapTo="Apworks.Bus.DirectBus.DirectMessageDispatcher, Apworks.Bus.DirectBus">
      77:         <lifetime type="ContainerControlledLifetimeManager"/>
      78:       </register>
      79:  
      80:       <register type="Apworks.Repositories.IDomainRepository, Apworks" mapTo="Apworks.Repositories.DomainRepository, Apworks">
      81:         <constructor>
      82:           <param name="storage">
      83:             <dependency type="Apworks.Events.Storage.IDomainEventStorage, Apworks"/>
      84:           </param>
      85:           <param name="eventBus">
      86:             <dependency type="Apworks.Bus.IEventBus, Apworks"/>
      87:           </param>
      88:         </constructor>
      89:       </register>
      90:  
      91:       <register type="Apworks.Storage.IStorageMappingResolver, Apworks"
      92:                   mapTo="Apworks.Storage.XmlStorageMappingResolver, Apworks"
      93:                   name="QueryStorageMappingResolver">
      94:         <constructor>
      95:           <param name="fileName" value="QueryObjectStorageMappings.xml"/>
      96:         </constructor>
      97:       </register>
      98:  
      99:       <register type="Apworks.Queries.Storage.IQueryObjectStorage, Apworks"
     100:                 mapTo="Apworks.Queries.Storage.SqlQueryObjectStorage, Apworks">
     101:         <constructor>
     102:           <param name="connectionString" 
     103: value="Data Source=.\SQLEXPRESS;Initial Catalog=TinyLibraryQueryDB;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True;"/>
     104:           <param name="mappingResolver">
     105:             <dependency type="Apworks.Storage.IStorageMappingResolver, Apworks" name="QueryStorageMappingResolver"/>
     106:           </param>
     107:         </constructor>
     108:       </register>
     109:  
     110:     </container>
     111:   </unityConfiguration>
     112:  
     113:   <system.web>
     114:     <compilation debug="true" targetFramework="4.0" />
     115:   </system.web>
     116:   <system.serviceModel>
     117:     <behaviors>
     118:       <serviceBehaviors>
     119:         <behavior>
     120:           <serviceMetadata httpGetEnabled="true"/>
     121:           <serviceDebug includeExceptionDetailInFaults="false"/>
     122:         </behavior>
     123:       </serviceBehaviors>
     124:     </behaviors>
     125:     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
     126:   </system.serviceModel>
     127:  <system.webServer>
     128:     <modules runAllManagedModulesForAllRequests="true"/>
     129:   </system.webServer>
     130:   
     131: </configuration>

    以上配置文件主要有两个configSection:apworksConfiguration和unityConfiguration,分别定义了针对Apworks框架和Microsoft Unity的配置内容。以下是Apworks框架配置的部分信息,仅供参考:

    • application:指定应用程序的启动器,它将被Apworks.Application.BootStrapperFactory类的Create方法创建
    • objectContainer:指定用于Apworks框架的IoC/DI容器适配器,目前Apworks只支持基于Microsoft Unity的适配器
    • generators:指定整个系统所使用的标识产生器与序列号产生器。如果未指定针对标识产生器的配置,则系统会默认使用Apworks.Generators.SequentialIdentityGenerator作为标识产生器;如果未指定针对序列号产生器的配置,则系统会默认使用Apworks.Generators.SequentialIdentityGenerator作为序列号产生器
    • handlers:指定定义了命令处理器与事件处理器的类型或程序集。当应用程序启动器启动系统的时候,这些处理器将被注册到系统中

    注意上面配置节中的黄色高亮部分,记得在实际使用中,将其修改为实际的数据库链接字符串。

    至此,我们已经完成了应用系统部分的开发任务,UI部分就是通过调用所需的WCF服务来实现其数据处理功能,因此本系列文章将不再讨论UI部分的实现方式。有兴趣的读者请直接到TinyLibraryCQRS的网站http://tlibcqrs.codeplex.com阅读完整源代码。下一讲将介绍系统的启动与运行相关内容。

  • 相关阅读:
    json数据读取后自动进行模板生成
    json数据排序
    fastjson json数据处理
    xml数据转Json
    jackson-dataformat-xml xml转json
    jar工具打包
    工具操作
    IBM MQ
    RabbitMq
    Excel4J
  • 原文地址:https://www.cnblogs.com/daxnet/p/1955180.html
Copyright © 2020-2023  润新知