• 使用Apworks开发基于CQRS架构的应用程序(六):创建.NET WCF服务


    在本节,我们将介绍.NET WCF服务的创建过程。

    1. Solution Explorer中,右键单击TinyLibraryCQRS,然后选择Add | New Project…菜单,这将打开Add New Project对话框
    2. Installed Templates 选项卡下,选择Visual C# | WCF,然后选择WCF Service Application,确保所选.NET版本为.NET Framework 4,在Name文本框中输入TinyLibrary.Services,然后单击OK按钮
    3. 右键单击TinyLibrary.ServicesReferences节点,然后选择Add Reference…菜单,这将打开Add Reference对话框
    4. 在.NET选项卡下,选择ApworksApworks.Bus.DirectBus以及Apworks.ObjectContainers.Unity,然后单击OK按钮
    5. 右键单击TinyLibrary.ServicesReferences节点,然后选择Add Reference…菜单,这将打开Add Reference对话框
    6. Projects选项卡下,选择TinyLibrary.EventsTinyLibrary.EventHandlersTinyLibrary.CommandsTinyLibrary.CommandHandlersTinyLibrary.Domain以及TinyLibrary.QueryObjects,然后单击OK按钮
    7. 将自动生成的Service1.svc文件删掉
    8. 右键单击TinyLibrary.Services项目,然后单击Add | New Item…菜单,这将打开Add New Item对话框
    9. Installed Templates选项卡下,选择Visual C# | Web,然后选择WCF Service,在Name文本框中,输入CommandService然后单击Add按钮
    10. 编辑CommandService.svc.cs文件,输入如下代码
         1: using System;
         2: using Apworks;
         3: using Apworks.Bus;
         4: using Apworks.Generators;
         5: using TinyLibrary.Commands;
         6:  
         7: namespace TinyLibrary.Services
         8: {
         9:     public class CommandService : ICommandService
        10:     {
        11:         private readonly ICommandBus bus = ObjectContainer.Instance.GetService<ICommandBus>();
        12:  
        13:         public long CreateReader(string loginName, string name)
        14:         {
        15:             long id = (long)IdentityGenerator.Instance.Generate();
        16:             RegisterReaderCommand command = new RegisterReaderCommand(id, loginName, name);
        17:             bus.Publish(command);
        18:             bus.Commit();
        19:             return id;
        20:         }
        21:  
        22:         public long CreateBook(string title, string publisher, DateTime pubDate, string isbn, int pages)
        23:         {
        24:             long id = (long)IdentityGenerator.Instance.Generate();
        25:             CreateBookCommand createBookCommand = new CreateBookCommand(id, 
        26:                 title, publisher, pubDate, isbn, pages, false);
        27:             bus.Publish(createBookCommand);
        28:             bus.Commit();
        29:             return id;
        30:         }
        31:  
        32:         public void BorrowBook(long readerId, long bookId)
        33:         {
        34:             BorrowBookCommand borrowBookCommand = new BorrowBookCommand(readerId, bookId);
        35:             bus.Publish(borrowBookCommand);
        36:             bus.Commit();
        37:         }
        38:  
        39:         public void ReturnBook(long readerId, long bookId)
        40:         {
        41:             ReturnBookCommand returnBookCommand = new ReturnBookCommand(readerId, bookId);
        42:             bus.Publish(returnBookCommand);
        43:             bus.Commit();
        44:         }
        45:     }
        46: }
    11. 用上面相同的方法创建一个QueryService.svc,然后编辑QueryService.svc.cs文件,输入如下代码
         1: using System;
         2: using System.Collections.Generic;
         3: using Apworks;
         4: using Apworks.Queries.Storage;
         5: using Apworks.Storage;
         6: using TinyLibrary.QueryObjects;
         7:  
         8: namespace TinyLibrary.Services
         9: {
        10:     public class QueryService : IQueryService
        11:     {
        12:         private IQueryObjectStorage GetQueryStorage()
        13:         {
        14:             return ObjectContainer.Instance.GetService<IQueryObjectStorage>();
        15:         }
        16:  
        17:         public BookObject GetBook(long id)
        18:         {
        19:             using (IQueryObjectStorage queryObjectStorage = this.GetQueryStorage())
        20:             {
        21:                 var pb = new PropertyBag();
        22:                 pb.Add("AggregateRootId", id);
        23:                 return queryObjectStorage.SelectFirstOnly<BookObject>(pb);
        24:             }
        25:         }
        26:  
        27:         public ReaderObject GetReader(long id)
        28:         {
        29:             using (IQueryObjectStorage queryObjectStorage = this.GetQueryStorage())
        30:             {
        31:                 var pb = new PropertyBag();
        32:                 pb.Add("AggregateRootId", id);
        33:                 return queryObjectStorage.SelectFirstOnly<ReaderObject>(pb);
        34:             }
        35:         }
        36:  
        37:         public ReaderObject GetReaderByLogin(string loginName)
        38:         {
        39:             using (IQueryObjectStorage queryObjectStorage = this.GetQueryStorage())
        40:             {
        41:                 var pb = new PropertyBag();
        42:                 pb.Add("LoginName", loginName);
        43:                 return queryObjectStorage.SelectFirstOnly<ReaderObject>(pb);
        44:             }
        45:         }
        46:  
        47:         public IEnumerable<BookObject> GetAllBooks()
        48:         {
        49:             using (IQueryObjectStorage queryObjectStorage = this.GetQueryStorage())
        50:             {
        51:                 return queryObjectStorage.Select<BookObject>();
        52:             }
        53:         }
        54:  
        55:         public IEnumerable<RegistrationObject> GetBookRegistrationHistory(long bookId)
        56:         {
        57:             using (IQueryObjectStorage qos = this.GetQueryStorage())
        58:             {
        59:                 PropertyBag pbCriteria = new PropertyBag();
        60:                 pbCriteria.Add("BookAggregateRootId", bookId);
        61:  
        62:                 PropertyBag pbSort = new PropertyBag();
        63:                 pbSort.AddSort<DateTime>("RegistrationDate");
        64:                 return qos.Select<RegistrationObject>(pbCriteria, pbSort, Apworks.Storage.SortOrder.Descending);
        65:             }
        66:         }
        67:  
        68:  
        69:         public IEnumerable<RegistrationObject> GetReaderRegistrationHistory(long readerId)
        70:         {
        71:             using (IQueryObjectStorage qos = this.GetQueryStorage())
        72:             {
        73:                 PropertyBag pbCriteria = new PropertyBag();
        74:                 pbCriteria.Add("ReaderAggregateRootId", readerId);
        75:  
        76:                 PropertyBag pbSort = new PropertyBag();
        77:                 pbSort.AddSort<DateTime>("RegistrationDate");
        78:                 return qos.Select<RegistrationObject>(pbCriteria, pbSort, Apworks.Storage.SortOrder.Descending);
        79:             }
        80:         }
        81:     }
        82: }
    12. 右键单击TinyLibrary.Services项目,然后选择Add | New Item…菜单,这将打开Add New Item对话框
    13. Installed Templates选项卡下,选择Visual C# | Web,然后选择Global Application Class,然后单击Add按钮
    14. 修改Global.asax.cs文件如下
         1: using System;
         2: using Apworks.Application;
         3:  
         4: namespace TinyLibrary.Services
         5: {
         6:     public class Global : System.Web.HttpApplication
         7:     {
         8:         private readonly IBootStrapper bootStrapper = BootStrapperFactory.Create();
         9:  
        10:         protected void Application_Start(object sender, EventArgs e)
        11:         {
        12:             bootStrapper.BootStrap();
        13:         }
        14:  
        15:         // ... other methods omitted here.
        16:     }
        17: }

    Global.asax文件中定义了,当应用程序启动时,同时会启动Apworks系统。首先,Apworks.Application.BootStrapperFactory类创建了启动实例,然后使用BootStrap方法来初始化应用程序。这个过程是在Apworks的配置文件中定义的,将在后续文章中讨论。

  • 相关阅读:
    Bootstrap 3 How-To #1 下载与配置
    一致性哈希算法及其在分布式系统中的应用
    哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用
    ASP.NET MVC3 系列教程
    浏览器对象模型BOM小结
    使用JS实现图片展示瀑布流效果
    利用JS实现购物网站商品放大镜效果
    js事件机制——事件冒泡和捕获
    js入门篇之正则表达式基础
    随机得到1-20之间的10个不相同的随机数
  • 原文地址:https://www.cnblogs.com/daxnet/p/1954427.html
Copyright © 2020-2023  润新知