我想知道我应该如何对我的存储库进行分组?就像我在asp.net mvc上看到的例子一样,在我的书中,他们基本上对每个数据库表使用一个存储库。但这似乎有很多存储库,导致您不得不调用许多存储库来进行模拟和其他工作。
所以我猜我应该对它们进行分组。然而,我不确定如何对它们进行分组。
现在我做了一个注册库来处理我所有的注册资料。然而,有大约4个表我需要更新,在此之前我有3个存储库来做这件事。
例如,其中一个表是许可证表。当它们注册时,我查看它们的密钥,并检查它是否存在于数据库中。现在,如果我需要在除注册之外的其他地点检查该许可证密钥或该表中的其他内容,会发生什么?
一个地方可能是登录(检查密钥是否过期)。
那么在这种情况下我该怎么做呢?再次重写代码(断开)?尝试将这两个存储库合并在一起,并希望在其他时间点上不需要任何方法(例如,我可能有一个方法来检查是否使用了userName -也许我会在其他地方需要它)。
此外,如果我将它们合并在一起,我要么需要两个服务层去同一个存储库,因为我认为拥有一个站点两个不同部分的所有逻辑会很长,而且我必须使用ValidateLogin()、ValdiateRegistrationForm()、ValdiateLoginRetrievePassword()等名称。
或者调用Repository,只是有一个听起来怪异的名字?
似乎很难让一个存储库有一个足够通用的名称,这样你就可以在应用程序的许多地方使用它,并且仍然有意义,我不认为在一个存储库中调用另一个存储库是一个好的做法?
发布于 2009-09-30 01:12:15
为了解决这个问题,我已经开始做的一件事就是实际开发包装N个存储库的服务。希望您的DI或IoC框架可以帮助简化这一过程。
public class ServiceImpl {
public ServiceImpl(IRepo1 repo1, IRepo2 repo2...) { }
}
这有意义吗?此外,我理解在这个庄园中谈论服务可能实际上符合DDD原则,也可能不符合DDD原则,我这样做只是因为它似乎有效。
发布于 2009-09-30 02:55:49
我要做的就是定义一个抽象基类,如下所示:
public abstract class ReadOnlyRepository<T,V>
{
V Find(T lookupKey);
}
public abstract class InsertRepository<T>
{
void Add(T entityToSave);
}
public abstract class UpdateRepository<T,V>
{
V Update(T entityToUpdate);
}
public abstract class DeleteRepository<T>
{
void Delete(T entityToDelete);
}
然后,您可以从抽象基类派生您的存储库,并扩展您的单个存储库,只要泛型参数不同,例如;
public class RegistrationRepository: ReadOnlyRepository<int, IRegistrationItem>,
ReadOnlyRepository<string, IRegistrationItem>
等等……
我需要单独的存储库,因为我们对一些存储库有限制,这给了我们最大的灵活性。希望这能有所帮助。
发布于 2010-02-18 12:28:41
使用FluentNHibernate的通用存储库实现的Here is an example。它能够持久化您为其编写映射器的任何类。它甚至能够基于映射器类生成您的数据库。
https://stackoverflow.com/questions/1495553
复制相似问题