クライアント アプリケーションで項目 ID を入力すると、WCF サーバーは type のオブジェクトを返すことになっていますItemDTO
。ただし、応答が行われると、オブジェクトは空になります。
ItemDTO itm = Connection.Instance.HttpProxy.GetItem(ItemID);
これまでに確認できること:
- 要求されたアイテムはデータベースから正常に取得されました
- マッピングは機能しました(結果のマッピングの内容を確認しました)
内容は確かに送信されました(Fiddlerを使用して確認)
しかし、中身を確認すると
itm
空っぽ。
これはGetItem()
、WCF サーバーのメソッドです。
public ItemDTO GetItem(string itemID) {
using (var db = new PoSEntities()) {
var query = from i in db.Items
where i.ItemID.Equals(itemID)
select i;
Item item = query.FirstOrDefault();
return item == null ? null : Mapping.Map<Item, ItemDTO>(item);
}
}
AutoMapper を使用してエンティティ オブジェクトを DTO にマップします。
public static H Map<T, H>(T i) {
Mapper.CreateMap<T, H>();
return Mapper.Map<T, H>(i);
}
Item
クラスは Entity Framework によって生成されます。
public partial class Item
{
public Item()
{
this.Sal1 = new HashSet<Sal1>();
}
public string ItemID { get; set; }
public string Name { get; set; }
public string Manufacturer { get; set; }
public int StockQuantity { get; set; }
public decimal Price { get; set; }
public virtual ICollection<Sal1> Sal1 { get; set; }
}
接続クラス:
public sealed class Connection {
private readonly string _address = "http://Edwin:8080/PoS";
private static Connection _instance;
private static object _padLock = new Object();
private static ChannelFactory<IPoS> httpFactory;
private static IPoS _httpProxy; //Singleton
public IPoS HttpProxy { get { return _httpProxy; } }
public static Connection Instance {
get {
if (_instance == null) {
lock (_padLock) {
if (_instance == null) {
_instance = new Connection();
}
}
}
return _instance;
}
}
private Connection() {
httpFactory = new ChannelFactory<IPoS>(
new BasicHttpBinding(),
new EndpointAddress(_address));
_httpProxy = httpFactory.CreateChannel();
}
}
ItemDTO
クラス:
[DataContract]
public class ItemDTO {
[DataMember]
public string ItemID { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Manufacturer { get; set; }
[DataMember]
public int StockQuantity { get; set; }
[DataMember]
public decimal Price { get; set; }
}