我有一个关于如何正确处理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并自行传递请求,或者这种当前方法是最合适的方法吗?任何帮助将不胜感激。
答案 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
的实例。添加不必要的复杂功能。