我有一个问题,特别是在使用服务堆栈时,如何正确地将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并传递请求本身,还是当前方法最合适?任何帮助将不胜感激。

最佳答案

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的实例。增加不必要的复杂性。

09-11 20:37