存储库模式帮助

时间:2010-12-17 14:53:10

标签: asp.net asp.net-mvc repository-pattern

我正在尝试为每个表创建一个存储库类。例如,我有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)
    {

    }
}

3 个答案:

答案 0 :(得分:2)

这取决于。事实上,在使用repository pattern时,应考虑aggregates,而不是表格。

  

通常每个人定义一个存储库   在域中聚合。那就是:我们   每个实体没有存储库!如果   我们来看一个简单的订单输入   系统实体订单可能是   订单聚合的根。因此我们   将有一个订单存储库。

所以,是的,根据您的域模型,您最终可能只有一个负责处理两个或多个实体(或表)的存储库类。但由于我不知道您的域模型的任何特殊性,我将无法告诉您这是否是这种情况。

请看一下here。这是NHibernate常见问题解答的链接,但即使您没有使用该ORM,也会提供相关信息。

答案 1 :(得分:1)

答案 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();
                }
           }
       }