ServiceStack服务与业务逻辑分离

时间:2014-05-22 19:40:24

标签: c# servicestack

我有一个关于如何正确处理Web API服务与业务逻辑分离的问题,尤其是在使用服务堆栈时。我试图改进的代码类似于以下内容:

public class TenantService : Service
{
   public object Post(TenantRequest req)
   {
       //create an instance of the struct to hold the data
       TenantObject tenant = new tenant{ //set properties from the resquest};
       TenantRecord.InsertRecord(tenant)
       // create a response after this //
   }  
}

然后在我的业务逻辑中,我有类似于以下内容:

public class TenantRecord
{
    public static void InsertRecord(TenantObject tenant)
    {
         //Instantiate a new Tenant POCO
         Tenant newRecord = new Tenant
         {
         Id = 1, Name = tenant.Name, CreatedDate = DateTime.Now, ...//And so on
         };
         db.Insert(newRecord);
     }
  }

这引起了巨大的麻烦,不断重写相同的代码主要是映射代码,但是不断创建结构以来回传递信息会导致大量的数据映射。此外,在某些情况下,一个请求必须处理许多不同类型的信息。

业务逻辑是否应引用API并自行传递请求,或者这种当前方法是最合适的方法吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

ServiceStack provides AutoMapping extension methods使您可以直接将DTO对象映射到您的模型,因此您不必手动设置关系。

因此,您的Insert方法变为:

public class TenantService : Service
{
    public object Post(TenantRequest req)
    {
        var tenant = new Tenant { CreatedDate = DateTime.Now }.PopulateWith(req);
        Db.Save(tenant);
        return new { Id = tenant.Id };
    }
}

我会将业务逻辑保留在操作方法中,除非您特别需要这种额外的抽象,例如可重用性。 除了静态InsertRecord方法之外,还需要解析db的实例。添加不必要的复杂功能。