我在确定负责管理实体内部关系的问题时遇到了一些问题。
说我有一个实体:
public class Customer : IEntity
{
public string Name { get; set; }
public List<Asset> Assets { get; set; }
}
还有一个名为CustomerRepository的存储库。客户存储库可以从持久数据源获取客户集合,并从所述数据源添加和删除。
到目前为止,我遵循单一责任原则。但是,当我尝试为客户点入资产时:
CustomerRepository repo = new CustomerRepository();
var customer = repo.FindById(1);
var assets = customer.Assets;
我会发现资产没有填充。答案是在某处填充资产......但在哪里?!
我可以在Customer实体Assets属性中使用另一个资产存储库(AssetRepository)执行更复杂的get方法,但这会违反单一责任原则。客户实体不仅负责构建数据,还负责关系。
我可以直接在存储库中填充Assets,同时创建一个客户实体,但同样,这确实给了存储库更多的责任。现在,它正在创建和填充两组实体,并为Customer分配Assets集合,在管理Customers集合时(例如在Find()或GetActiveCustomers()方法中),它会变得更加低效和难以处理。更不用说资产中是否有其他实体集合,那么存储库将在实体内的实体内填充许多不同类型的实体。
我觉得好像我错过了一些基本的设计,但没有多少谷歌搜索给我答案。
总而言之,应该负责管理实体之间的关系,并为所述实体填充数据。
我还应该提到我没有使用实体框架,因此EF的任何预构建实现部分都不合适,但是调整EF生成的模式是可以接受的。