だから私はこのようなドメインモデルを持っています。
public enum ItemType
{
TypeA,
TypeB
}
public class Item
{
public int ID;
public ItemType Type;
public ItemServiceFactory Factory = new ItemServiceFactory();
public IItemService ItemService { get; set; }
public Item(ItemType type )
{
ItemService = Factory.GetItemService(type);
Type = type;
}
public ItemValue GetValue()
{
return ItemService.GetValue(this);
}
}
public interface IItemService
{
ItemValue GetValue(Item item);
}
public class ItemServiceA : IItemService
{
private readonly WebServiceA _webServiceA = new WebServiceA();
public ItemValue GetValue(Item item)
{
return new ItemValue(_webServiceA.GetValuesA(new List<int> { item.ID }).FirstOrDefault());
}
}
public class ItemServiceB : IItemService
{
private readonly WebServiceB _webServiceB = new WebServiceB();
public ItemValue GetValue(Item item)
{
return new ItemValue(_webServiceB.GetValuesB(new List<int> { item.ID }).FirstOrDefault());
}
}
public class ItemServiceFactory
{
public IItemService GetItemService(ItemType type)
{
switch (type)
{
case ItemType.TypeA: return new ItemServiceA();
case ItemType.TypeB: return new ItemServiceB();
default: throw new ArgumentOutOfRangeException();
}
}
}
public class ItemValue
{
public int Value;
public ItemValue(int value)
{
Value = value;
}
}
public class WebServiceB
{
public IEnumerable<int> GetValuesB(IEnumerable<int> idList)
{//call web service. dummy here.
return idList.Select(x => x + 100);
}
}
public class WebServiceA
{
public IEnumerable<int> GetValuesA(IEnumerable<int> idList)
{//call web service. dummy here.
return idList.Select(x => x - 100);
}
}
var tooManyItems = new List<Item>
{
new Item(ItemType.TypeA),
new Item(ItemType.TypeA),
new Item(ItemType.TypeA),
new Item(ItemType.TypeA),
new Item(ItemType.TypeA),
new Item(ItemType.TypeA),
new Item(ItemType.TypeA),
new Item(ItemType.TypeA),
new Item(ItemType.TypeB),
new Item(ItemType.TypeB),
new Item(ItemType.TypeB),
new Item(ItemType.TypeB),
new Item(ItemType.TypeB),
new Item(ItemType.TypeB),
new Item(ItemType.TypeB),
new Item(ItemType.TypeB)
};
Console.WriteLine(tooManyItems.Select(x => x.GetValue().Value));//or whatever.
今、私はDDD(ドメイン駆動設計)に従っており、Itemクラスを保持して、その値を取得する方法を知りたいと思っています。現在のモデルでは、 Item クラスが初期化されると、 Itemtypeに基づいてItemServiceA/ItemServiceBが設定されます。ItemObj.GetValue() が呼び出されると、Item クラスは、使用する必要があるサービスを「認識」し、その後、このコードで、呼び出す Web サービスを認識します。
注: WebService は項目のリストの呼び出しをサポートしていますが、現在のモデルでは、常に 1 つの項目リストとしてのみ渡されます (すべての Item オブジェクトの GetValue() に対して)。
現在のコードの問題は、アイテムの長いリストがあり、すべてのアイテムの値が必要で、それらが Web サービスからのものである場合、これは非常に非効率的で遅いことです。
質問: この設計では、アイテムがその値を取得する方法を把握できるようにし、複数のアイテムの呼び出しを WebServiceA と WebServiceB への 2 つの異なる呼び出しにグループ化したいと考えています。何か案は?
ありがとう