我有一个问题,特别是在使用服务堆栈时,如何正确地将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
的实例。增加不必要的复杂性。