私のWeb APIメソッドは、プロファイルに関するいくつかの構造化データを返す必要があります。そのために、次のPOCOクラスを作成しました。
public class ProfileInfo
{
public string FirstName { get; set; }
public string LastName { get; set; }
//....
public ProfileAddress Address { get; set; }
public ProfileDriverLicense DriverLicense { get; set; }
public ProfileEmergency Emergency { get; set; }
public ProfileEmployment Employment { get; set; }
public ProfileCompensation Compensation { get; set; }
public ProfileFuel Fuel { get; set; }
public ProfileCompanyInfo CompanyInfo { get; set; }
}
public class ProfileAddress
{
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
}
public class ProfileDriverLicense
{
//....
}
public class ProfileEmergency
{
//....
}
public class ProfileEmployment
{
//....
}
public class ProfileCompensation
{
//....
}
public class ProfileFuel
{
//....
}
public class ProfileCompanyInfo
{
//....
}
ご覧のとおり、ネストしたPOCOクラスは多数あります。
profileInfoオブジェクトを入力して返すサービスメソッド:
public ProfileInfo GetProfile(string username)
{
var profile = _db.Drivers.Where(p => p.AspNetUser.UserName == username).Select(k => new ProfileInfo()
{
FirstName = k.AspNetUser.FirstName,
LastName = k.AspNetUser.LastName,
Username = username,
Address = new ProfileAddress()
{
Address = k.StreetAddress,
City = k.City,
State = k.State,
Zip = k.Zip
},
AvatarUrl = k.AvatarUrl,
CompanyInfo = new ProfileCompanyInfo()
{
//....
},
Compensation = new ProfileCompensation()
{
//....
},
DateOfBirth = k.DOB,
DriverLicense = new ProfileDriverLicense()
{
//....
},
Email = k.AspNetUser.UserName,
Emergency = new ProfileEmergency()
{
//....
},
Employment = new ProfileEmployment()
{
//....
},
Fuel = new ProfileFuel()
{
//....
},
Phone = k.PhoneNo,
SSN = k.SSN,
Notes = k.Notes,
Truck = (k.Truck != null) ? k.Truck.TruckNo : null,
Trailer = (k.Trailer != null) ? k.Trailer.TrailerNo : null
}).FirstOrDefault();
if (profile == null)
throw new Domain.InvalidDriverException(username);
return profile;
}
およびWebAPIメソッド:
[HttpGet]
[Route("MyProfile")]
public HttpResponseMessage GetProfile()
{
string username = GetUsernameFromClaims();
if (String.IsNullOrWhiteSpace(username))
return Request.CreateErrorResponse(HttpStatusCode.NotFound, "User not found");
var profile = _serviceDriver.GetProfile(username);
return Request.CreateResponse<Domain.POCO.Profile.ProfileInfo>(profile);
}
それは動作し、正常に動作します。しかし、具体的にこの場合にPOCOクラスを使用する利点はありますか?または、動的を使用して同じ効果を得ることができますが、コードははるかに少なく、欠点はありませんか?動的な場合、これらのPOCOクラスをすべて記述する必要はなく、変更も非常に簡単です。ダイナミックの動作は非常に遅く、間違いを見つけるのは簡単ではありません(コンパイルエラーはありません)が、その結果、Web APIはJSONを返します。これは、デフォルトでは厳密な型ではありません。 POCOクラスを作成して使用する意味は何ですか?
PS。私は強い型を使用していますが、それは私にとってはより快適です:)しかし、おそらく具体的なケースでは、私は多くの追加コードを記述しますか?
強く型付けされた戻り値を持つことの利点は、人々があなたのためにクライアントを自動生成することを可能にする説明的なドキュメント(例えば swagger を使用して Swashbuckle )を持つことができることですAPI。
外観が文書化されていないJSONデータを返すだけの場合、ユーザー側で多くのエラーチェックを行わずに動的に作成する必要があるだけでなく、クライアントはそれがどのように見えるかを知る方法がありません。つまり、両側の試行錯誤です。
ホスティングレイヤーの厳密に型指定されたPOCOオブジェクトにはほとんど利点がないという点で、あなたは正しいです。
実際、私は強力な型付けを使用することを支持していますが、シリアライゼーションのためにいくつかのパラメーターを大まかにラップする新しい要求/応答型オブジェクトを作成するのではなく、動的を使用して喜んでいます。
しかしながら!強力な型は、サービス層で目的を果たします。つまり、コンパイル時にエラーチェックなどを行います。
さらに、APIにクライアントライブラリを提供することを期待しています。この場合も、サービスレイヤーと同じ強力な型とインターフェイスを使用すると、多くの利点があります。