所以我有一个这样的域模型。
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支持调用item列表,但在当前模型中,它总是作为一个item list传递。(对于每个Item对象的GetValue())
现在当前代码中的问题是,如果我有一个很长的项目列表并且我想要所有项目的值,并且它们来自某个 Web 服务,那么这是非常低效和缓慢的。
问题:在这个设计中,我想让 Item 知道如何获取它的值,并且希望将多个项目的调用分组为对 WebServiceA 和 WebServiceB 的两个不同调用。有任何想法吗?
谢谢