我正在尝试为每个表创建一个存储库类。例如,我有TableA,TableB和TableC。 TableB和TableC具有TableA的外键。我使用SaveData()和ListData()为TableA,TableB和TableC创建了一个接口。我有MVC表单,将数据插入这些表。实现这些接口方法时,我是否必须为每个接口创建一个单独的类?如果我做得对,请告诉我。我感谢任何帮助。
Public interface ITableA
{
void SaveData(TableAEntity);
List<TableAEntity> ListData();
}
Public interface ITableB
{
void SaveData(TableBEntity);
List<TableBEntity> ListData();
}
Public class ImplementTableA_TableB: ITableA, ITableB
{
public void SaveData(TableAEntity)
{
}
public void SaveData(TableBEntity)
{
}
}
答案 0 :(得分:2)
这取决于。事实上,在使用repository pattern时,应考虑aggregates,而不是表格。
通常每个人定义一个存储库 在域中聚合。那就是:我们 每个实体没有存储库!如果 我们来看一个简单的订单输入 系统实体订单可能是 订单聚合的根。因此我们 将有一个订单存储库。
所以,是的,根据您的域模型,您最终可能只有一个负责处理两个或多个实体(或表)的存储库类。但由于我不知道您的域模型的任何特殊性,我将无法告诉您这是否是这种情况。
请看一下here。这是NHibernate常见问题解答的链接,但即使您没有使用该ORM,也会提供相关信息。
答案 1 :(得分:1)
这是一篇很好的文章,解释了存储库模式:http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/10/08/the-repository-pattern.aspx
答案 2 :(得分:1)
最简单的方法是:
步骤1:为您需要的每个实体创建模型。
例如
public class BankAccount
{
public virtual int ID { get; set; }
public virtual string BankAccNo { get; set; }
public virtual int BankCode { get; set; }
}
步骤2:使用Automapper
创建到数据库表的映射例如
public class BankAccountMap : ClassMap<BankAccount>
{
public BankAccountMap()
{
Id(x => x.ID);
Map(x => x.BankAccNo);
Map(x => x.BankCode);
Table("dbo.BankAccount");
}
}
步骤3:创建一个可以执行所有数据库操作的存储库。
public class BankAccountRepository : BaseRepository<BankAccount>, IRepository<BankAccount>
{
public BankAccountRepository(ISessionFactoryCreator sessionFactoryCreator) : base(sessionFactoryCreator)
{
_sessionFactory = sessionFactoryCreator.CreateSessionFactory();
}
public BankAccount GetByBankCode(int code)
{
using (var session = _sessionFactory.OpenSession())
{
return session.Linq<BankAccount>().Where(o => o.BankCode == code).ToList<BankAccount>().FirstOrDefault();
}
}
}