私はServiceStackの使用に熱心で、簡単なカスタマー サービスを備えた小さなテスト アプリを作成しました。
[Route("/customers/{id}")]
public class GetCustomer : IReturn<Customer>
{
public int Id { get; set; }
}
[Route("/customers/search")]
public class FindCustomers : IReturn<List<Customer>>
{
public string LastName { get; set; }
public int Age { get; set; }
public string? City { get; set; }
}
public class CustomerService : IService
{
public object Get(GetCustomer request)
{
var db = new WebServDb();
var customer = db.FirstOrDefault<Customer>("WHERE Id=@0", request.Id);
return customer;
}
public object Get(FindCustomers request)
{
var db = new WebServDb();
var customers = new List<Customer>();
if (request.City.HasValue)
customers = db.Fetch<Customer>("WHERE LastName=@0 AND Age=@1 AND City=@2", request.LastName, request.Age, request.City);
else
customers = db.Fetch<Customer>("WHERE LastName=@0 AND Age=@1", request.LastName, request.Age);
return customers;
}
}
FindCustomersリクエスト DTO には、顧客の検索に使用できる 3 つのプロパティが含まれています。どのプロパティが設定されているかに基づいて、DB に異なるクエリを実行する必要があります。では、これを行う最善の方法は何ですか? たとえば、次のような別のプロパティを追加するとします。
[Route("/customers/search")]
public class FindCustomers : IReturn<List<Customer>>
{
public string LastName { get; set; }
public int Age { get; set; }
public string? City { get; set; }
public string? ZipCode { get; set; }
}
FindCustomers DTO に追加するには、サービスのGetメソッドを次のように変更する必要もあります。
public object Get(FindCustomers request)
{
var db = new WebServDb();
var customers = new List<Customer>();
if (request.City.HasValue && request.ZipCode.HasValue)
customers = db.Fetch<Customer>("WHERE LastName=@0 AND Age=@1 AND City=@2 AND ZipCode=@3", request.LastName, request.Age, request.City, request.ZipCode);
else if (request.City.HasValue)
customers = db.Fetch<Customer>("WHERE LastName=@0 AND Age=@1 AND City=@2", request.LastName, request.Age, request.City);
else
customers = db.Fetch<Customer>("WHERE LastName=@0 AND Age=@1", request.LastName, request.Age);
return customers;
}
したがって、リクエスト DTO に追加/削除するプロパティごとに、Getメソッドを変更する必要があります。これを行うより良い方法はありますか?プロパティ セットと DB のクエリを確認するより一般的な方法は?
FindCustomersByLastNameCity、FindCustomersByLastNameZipCodeなどの特定のリクエスト DTOと、対応するCustomerServiceの特定の Get メソッドを用意したほうがよいでしょうか?