Вы никогда не должны возвращать тип значения в ServiceStack Service, он должен быть ссылочным типом, обычно DTO с типизированным ответом, но также может быть необработанным типом данных, таким как string
или byte[]
, но он никогда не должен быть Значение Тип, например целое число, которое не будет работать в некоторых функциях ServiceStack.
Для этой службы я бы либо возвратил объект SecPermission
, либо объект AddPermissionResponse
с целым числом в результирующем значении.
Обратите внимание, что OrmLite Insert()
API возвращает long
, поэтому вы видите длинную, однако вам нужно либо вызвать Save (), либо указать selectIdentity: true , чтобы получить недавно вставленный идентификатор первичного ключа [AutoIncrement]
, например:
var newId = db.Insert(perm, selectIdentity:true);
или
Db.Save(perm);
var newId = perm.Id; //auto populated with auto incremented primary key
Кроме того, вам не нужны ни [PrimaryKey]
, ни [AutoIncrement]
в OrmLite, поскольку [AutoIncrement]
определяет первичный ключ самостоятельно, как и при использовании соглашения о свойстве Id .
.
Также, если вы собираетесь позвонить в Службу напрямую, вы также можете ввести ответ, чтобы избежать разыгрывания, например:
public SecPermission Post(AddPermission request)
{
//...
Db.Save(perm);
return perm;
}
Тогда вам не нужно разыгрывать заклинание при непосредственном вызове, например:
var id = service.Post(new AddPermission { ... }).Id;
В ServiceStack нет различий в поведении при использовании object
или в типизированном ответе, например SecPermission
, хотя лучше указывать его в запросе DTO с помощью маркера интерфейса IReturn<T>
, например:
public AddPermission : IReturn<SecPermission> { ... }
Поскольку он включает сквозные типизированные API при вызове из сервисных клиентов, например:
SecPermission response = client.Post(new AddPermission { ... });