我正在使用 ASP.NET MVC 设计一个网站,我可能对存储库的确切性质有点困惑。
按照 NerdDinner 示例,我的站点应该有一个存储库,可以根据需要为实体提供服务。但是,我还听说您应该有不同的存储库来处理特定的相关实体集....?
就我的网站而言,将有许多实体(大约 15 个表),但大多数都是相关的。拥有一个包含拉/更新/删除等所需的所有方法的存储库是否可以/可取,还是应该将它们拆分?
我正在使用 ASP.NET MVC 设计一个网站,我可能对存储库的确切性质有点困惑。
按照 NerdDinner 示例,我的站点应该有一个存储库,可以根据需要为实体提供服务。但是,我还听说您应该有不同的存储库来处理特定的相关实体集....?
就我的网站而言,将有许多实体(大约 15 个表),但大多数都是相关的。拥有一个包含拉/更新/删除等所需的所有方法的存储库是否可以/可取,还是应该将它们拆分?
我使用一个通用存储库,它对许多实体来说已经足够了。
对于更复杂的,我只是用需要的东西来扩展它。真是两全其美。
如果您使用接受类型的通用存储库,那么我看不出有任何理由使用多个类型。
我们使用这样的接口:
public interface IRepository
{
void Save<ENTITY>(ENTITY entity)
where ENTITY : Entity;
void Delete<ENTITY>(ENTITY entity)
where ENTITY : Entity;
ENTITY Load<ENTITY>(int id)
where ENTITY : Entity;
IQueryable<ENTITY> Query<ENTITY>()
where ENTITY : Entity;
IList<ENTITY> GetAll<ENTITY>()
where ENTITY : Entity;
IQueryable<ENTITY> Query<ENTITY>(IDomainQuery<ENTITY> whereQuery)
where ENTITY : Entity;
ENTITY Get<ENTITY>(int id) where ENTITY : Entity;
IList<ENTITY> GetObjectsForIds<ENTITY>(string ids) where ENTITY : Entity;
void Flush();
}
然后在这样的代码中使用:
var returnedObjects = repository.GetAll<ObjectClass>();
var singleObject = repository.Get<ObjectClass>(id);
我为每个数据对象创建一个存储库。
例如,一个简单的图书馆数据库可以包含以下存储库:
您不应该为每个表创建存储库。正如queen3 所说,您应该为每个聚合根创建存储库。就像,如果产品可以有一个类别,那么类别存储库应该是产品的嵌套类。遵循域逻辑关系比域对象。
Queen3 是对的,您可以遵循 Aggregate Root 理论。我基本上对我的存储库进行分组,而不是考虑实体,而是它们如何在我正在构建的应用程序中进行逻辑分组。
例如:
CustomersRepository
OrdersRepository
...
在 CustomerRepository 中,我会放置 GetCustomers、GetCustomer、AddCustomer、DeleteCustomer、AddCustomerContact、DeleteCustomerContact 的方法。
在 OrdersRepository 中,我会放置 GetOrders、GetOrder、AddOrder、CancelOrder、CloneOrder、AddOrderDetail、DeleteOrderDetail 等方法。
我倾向于为每个相关的实体组使用一个存储库。即 orderrepository 可能有:
订单和订单详情。
并且会有另一个用于客户、客户资料等。
这使存储库类保持整洁。
戴维