我在这个过程中设计在ASP.NET MVC网站和我也许到存储库的确切性质有点困惑。
继的NerdDinner例如,我的网站应该有一个仓库,因为我需要他们供应了实体。 但是,我还听说,你应该有一个由相关实体的特定集合处理不同repositorys ....?
在我的网站的情况下,会有一些实体(约15桌),但大部分都有关。 它是确定/最好有一个包含我需要拉/更新/删除等,或者我应该分割下来的所有方法的一个信息库?
我在这个过程中设计在ASP.NET MVC网站和我也许到存储库的确切性质有点困惑。
继的NerdDinner例如,我的网站应该有一个仓库,因为我需要他们供应了实体。 但是,我还听说,你应该有一个由相关实体的特定集合处理不同repositorys ....?
在我的网站的情况下,会有一些实体(约15桌),但大部分都有关。 它是确定/最好有一个包含我需要拉/更新/删除等,或者我应该分割下来的所有方法的一个信息库?
我创建的每个数据对象存储库。
例如,一个简单的库数据库可能包括以下库:
我使用一个通用的宝库,它是足够的许多实体。
对于更复杂的一个,我只是用所需的内容扩展此。 两全其美真的。
在领域驱动设计,有一个规则库是每个聚合根。 你可以阅读更多关于它在这里 。
我读的越多,我越觉得的NerdDinner经常被人视为良好做法的集合,而这是绝对没有(看到这里的,特别是,仓库的NerdDinner讨论)。 这就是为什么人们常常指责对方MS的例子像Oxite (和在这里 :
开发商将聚集到它,赞美它,一味地因为它来自微软接受它作为福音(它已经大步向)。 可悲的是,它采用的精神,任何开发人员将留下一个unmaintainble,不可测和混乱不可读
)。
如果您使用的接受类型的通用信息库,然后我看不出有任何理由使用超过一个。
,我们使用这样的界面:
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);
我想也许是什么的仓库可能会混淆你的空话。 为了我的仓库是数据存储(即,MS SQL数据库),其中数据被存储到的。
继Repository模式我建议为每个数据存储在单个程序存储库。 我的大部分项目,我用MS SQL的,所以我创建该数据库(我喜欢使用一个仓库亚音速我DAL / ORM,同时也实现了Repositry模式和ActiveRecord的模式),那么我为每个表工厂。 这让我包裹起来的亚音速的ActiveRecord类和给我的抽象。
希望这就是有益的,也许...
你不应该每次创建每个表库。 作为queen3说,你应为每个聚合根库。 就像,如果产品能有一个类别,类别库应该是一个嵌套类产品。 按照比域对象的域的逻辑关系。
Queen3是正确的,你可以遵循聚合根理论。 我基本上组我的仓库不是在实体思维,但他们怎么组逻辑上我正在创建的应用程序。
例如:
CustomersRepository
OrdersRepository
...
在CustomerRepository我会把对GetCustomers的,GETCUSTOMER,AddCustomer,DeleteCustomer,AddCustomerContact,DeleteCustomerContact方法。
在OrdersRepository我会把对GetOrders,GetOrder,AddOrder,CancelOrder,CloneOrder,AddOrderDetail,DeleteOrderDetail等方法。
我倾向于使用每个组相关entitites的存储库。 即orderrepository可能有:
为了和的OrderDetail。
并且还会有一个,比如说,客户,CustomerProfile等。
这使库类整洁。
戴维